当前位置: 首页 > news >正文

MQTT在linux下服务端和客户端的应用

MQTT(Message Queuing Telemetry Transport)是一种轻量级、开放标准的消息传输协议,设计用于受限设备和低带宽、不稳定网络的通信。
在这里插入图片描述

MQTT的一些关键特点和概念:

发布/订阅模型:

MQTT采用发布/订阅(Publish/Subscribe)模型。发布者(Publisher)发布消息到特定的主题(Topic),而订阅者(Subscriber)则订阅感兴趣的主题。这种模型提供了一种松耦合的通信方式。MQTT支持基于TLS/SSL的加密通信,提供一定的安全性。

主题(Topic):

主题是消息的标签或类别。发布者将消息发布到特定的主题,而订阅者则通过订阅特定的主题来接收相关消息。

消息队列:

MQTT消息以队列的方式传输。当发布者发布消息时,消息被发送到相应主题的队列,订阅者可以从队列中接收消息。

QoS级别(Quality of Service):

MQTT支持不同的QoS级别,用于确保消息的可靠性和传递顺序。包括:
QoS 0:最多一次,消息发出后不进行确认。
QoS 1:至少一次,确保消息至少被传递一次。
QoS 2:只有一次,确保消息仅被传递一次。

保持连接:

MQTT客户端与服务器之间保持持久连接。这允许客户端随时接收实时消息,而不需要频繁地建立和断开连接。

清理会话(Clean Session):

客户端可以选择创建一个清理会话或一个持久会话。清理会话意味着服务器不会保留客户端的订阅信息,而持久会话则会保存订阅信息。

遗嘱消息(Will Message):

客户端可以指定遗嘱消息,以便在客户端异常断开连接时,服务器可以将遗嘱消息发布到预定的主题。

中继器(Broker):

MQTT系统通常包含一个中继器或代理,负责接收、路由和分发消息。这个中继器被称为MQTT Broker。

MQTT服务端

首先,安装MQTT库,例如 Eclipse Paho MQTT C库。

// mqtt_server.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <MQTTClient.h>#define SERVER_ADDRESS "tcp://localhost:1883"
#define CLIENT_ID "MQTT_Server"
#define TOPIC "test_topic"volatile MQTTClient_deliveryToken deliveredtoken;void messageArrived(void *context, char *topicName, int topicLen, MQTTClient_message *message) {printf("Received message on topic: %s\n", topicName);printf("Message: %.*s\n", message->payloadlen, (char *)message->payload);MQTTClient_freeMessage(&message);MQTTClient_free(topicName);
}int main() {MQTTClient client;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;int rc;// Create MQTT clientMQTTClient_create(&client, SERVER_ADDRESS, CLIENT_ID, MQTTCLIENT_PERSISTENCE_NONE, NULL);// Set callback for incoming messagesMQTTClient_setCallbacks(client, NULL, NULL, messageArrived, NULL);// Connect to the brokerconn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {printf("Failed to connect to the broker, return code %d\n", rc);exit(EXIT_FAILURE);}// Subscribe to a topicif ((rc = MQTTClient_subscribe(client, TOPIC, 1)) != MQTTCLIENT_SUCCESS) {printf("Failed to subscribe to topic, return code %d\n", rc);exit(EXIT_FAILURE);}printf("MQTT server is running...\n");// Keep the program runningwhile (1) {sleep(1);}// Disconnect from the brokerMQTTClient_disconnect(client, 10000);MQTTClient_destroy(&client);return 0;
}

MQTT客户端

// mqtt_client.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h>#define SERVER_ADDRESS "tcp://localhost:1883"
#define CLIENT_ID "MQTT_Client"
#define TOPIC "test_topic"
#define QOS 1int main() {MQTTClient client;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;int rc;// Create MQTT clientMQTTClient_create(&client, SERVER_ADDRESS, CLIENT_ID, MQTTCLIENT_PERSISTENCE_NONE, NULL);// Connect to the brokerconn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {printf("Failed to connect to the broker, return code %d\n", rc);exit(EXIT_FAILURE);}// Publish a messageconst char *message = "Hello, MQTT!";MQTTClient_message pubmsg = MQTTClient_message_initializer;pubmsg.payload = (void *)message;pubmsg.payloadlen = (int)strlen(message);pubmsg.qos = QOS;pubmsg.retained = 0;MQTTClient_deliveryToken token;if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS) {printf("Failed to publish message, return code %d\n", rc);exit(EXIT_FAILURE);}printf("Message published to topic: %s\n", TOPIC);// Disconnect from the brokerMQTTClient_disconnect(client, 10000);MQTTClient_destroy(&client);return 0;
}

相关文章:

MQTT在linux下服务端和客户端的应用

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、开放标准的消息传输协议&#xff0c;设计用于受限设备和低带宽、不稳定网络的通信。 MQTT的一些关键特点和概念&#xff1a; 发布/订阅模型&#xff1a; MQTT采用发布/订阅&#xff08;Publ…...

韦达定理用处多

文章目录 前言一、一元二次方程中根和系数之间的关系二、韦达定理的数学推导和作用1. 韦达定理的数学推导2. 韦达定理的作用 三、韦达定理的应用举例1. 解题示例12. 解题示例23. 解题示例34. 解题示例45. 解题示例56. 解题示例67. 解题示例7 总结 前言 韦达定理说明了一元n次方…...

Kotlin-类

构造函数 Java final File file new File("file.txt");Kotlin val file File("file.txt")类 Java public final class User { }Kotlin class User公开类 Java public class User { }Kotlin open class User属性类 Java final class User {pri…...

redis基本数据结构介绍

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合、有序集合等。这些数据结构为开发者提供了丰富的数据操作方式&#xff0c;使得Redis在缓存、消息队列、排行榜…...

云数据库RDS云监控

1. 什么是云数据库RDS&#xff1f;它有哪些特点&#xff1f; 云数据库RDS是一种在线关系型数据库服务&#xff0c;它具备的特点包括&#xff1a; 安全可靠&#xff1a;提供了容灾、备份、恢复等高可用性功能&#xff0c;确保数据的安全与可靠。弹性伸缩&#xff1a;用户可以根…...

全自动网页生成系统重构版源码

全自动网页生成系统重构版源码分享&#xff0c;所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐的注…...

Leetcode—33. 搜索旋转排序数组【中等】

2024每日刷题&#xff08;110&#xff09; Leetcode—33. 搜索旋转排序数组 实现代码 class Solution { public:int search(vector<int>& nums, int target) {int n nums.size();int l 0, r n - 1;while(l < r) {int m l (r - l) / 2;if(nums[m] target) …...

vulhub中Apache APISIX Dashboard API权限绕过导致RCE(CVE-2021-45232)

Apache APISIX是一个动态、实时、高性能API网关&#xff0c;而Apache APISIX Dashboard是一个配套的前端面板。 Apache APISIX Dashboard 2.10.1版本前存在两个API/apisix/admin/migrate/export和/apisix/admin/migrate/import&#xff0c;他们没有经过droplet框架的权限验证&…...

JavaSE习题 使用函数求最大值、求最大值方法的重载和求和方法的重载

目录 1 使用函数求最大值2 求最大值方法的重载3 求和方法的重载 1 使用函数求最大值 使用函数求最大值&#xff1a;创建方法求两个数的最大值max2&#xff0c;随后再写一个求3个数的最大值的函数max3。 ​要求&#xff1a; 在max3这个函数中&#xff0c;调用max2函数&#xff…...

英码科技携手昇腾共建算力底座:推出EA500I超强AI处理能力边缘计算盒子!

在数字经济浪潮中&#xff0c;算力已成为不可或缺的驱动力&#xff0c;为各行各业的数字化转型提供了强大的推动力。面对多元化和供需不平衡的挑战&#xff0c;需要实现从理论架构到软硬件实现的质的飞跃&#xff0c;以满足持续增长的算力需求&#xff0c;华为昇腾在这一方面展…...

蓝桥杯每日一题-----数位dp练习

题目 链接 参考代码 写了两个&#xff0c;一个是很久以前写的&#xff0c;一个是最近刚写的&#xff0c;很久以前写的时候还不会数位dp所以写了比较详细的注释&#xff0c;这两个代码主要是设置了不同的记忆数组&#xff0c;通过这两个代码可以理解记忆数组设置的灵活性。 im…...

JS(react)图片压缩+图片上传

上传dome var fileNodeTakeStock: any createRef();<inputref{fileNodeTakeStock}onChange{showPictureTakeStock}style{{ display: "none" }}id"fileInpBtn"type"file"accept"image/*" //限制上传格式multiple{false}capture&qu…...

WPF DispatcherTimer用法

System.Windows.Threading.DispatcherTimer 类主要用于WPF应用程序中进行周期性任务调度&#xff0c;并且保证这些任务在UI线程上执行。 这对于需要更新界面或与UI元素交互的定时操作非常有用&#xff0c;因为WPF的所有UI操作都必须在主线程&#xff08;即Dispatcher线程&…...

【网络安全实验】snort实现高级IDS

注&#xff1a;本实验分别使用kali和CentOS6.8进行测试&#xff0c;可惜的是使用kali进行实验过程中遇到了困难&#xff0c;未能完成完整实验&#xff0c;而使用CentOS6.8成功完成了完整实验。 实验中用到的软件&#xff1a; https://download.csdn.net/download/weixin_5255…...

19.HarmonyOS App(JAVA)依赖布局DependentLayout使用方法

layout/ability_main.xml 显示位置不对&#xff1a;检查布局文件ohos:lef_of "id:tuzi",比如显示在兔子的左侧&#xff0c;这里就会显示不对。 需要id前没有$符号。改为&#xff1a; ohos:lef_of "$id:tuzi" <?xml version"1.0" encodi…...

玩家笔记:幻兽帕鲁搭建服务器开服教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…...

Liunx基本指令

目录 1、ls 列出当前路径下的文件 2、pwd 打印当前工作目录 (print working directory) 3、cd 进入路径 4、mkdir 创建文件夹(make dirctory) 5、touch 创建文件 6、cp 复制(copy) 7、mv 移动/剪切、重命名 8、rm 删除 (remover) 9、vim 文本编辑器 10、cat 打开文件…...

面试题:Redis 分布式锁存在什么问题 ?如何解决 ?

文章目录 如何实现分布式锁2. Redis 分布式锁存在什么问题2.1 解决死锁问题2.2 解决锁误删问题 如何实现分布式锁 Redis 天生就可以作为一个分布式系统来使用&#xff0c;所以它实现的锁都是分布式锁。 Redis 可以通过 setnx&#xff08;set if not exists&#xff09;命令实…...

Container 命令ctr、crictl 命令

1、 Containerd和Docker的架构区别 Docker vs. Containerd&#xff1a; 2、ctr & crictl的区别 ctr是containerd的一个客户端工具 crictl 是 CRI 兼容的容器运行时命令行接口&#xff0c;可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序 crictl 则直接对…...

设计模式——七大原则

​更多内容&#xff0c;前往 IT-BLOG ​设计模式的目的是为了让程序&#xff0c;具有更好的代码重用性、可读性&#xff08;编程规范性&#xff0c;便于后期维护和理解&#xff09;、可扩展性&#xff08;当需要增加新需求时&#xff0c;非常方便&#xff09;、可靠性&#xf…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...