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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/453975.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

88.网游逆向分析与插件开发-物品使用-物品使用策略管理UI的设计

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;物品交换的逆向分析与C封装-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;f1b9b1a69ac3e2c3…

从零开始手写mmo游戏从框架到爆炸(三)— 服务启动接口与网络事件监听器

上一章我们完成了netty服务启动的相关抽象&#xff08;https://blog.csdn.net/money9sun/article/details/136025471&#xff09;&#xff0c;这一章我们再新增一个全局的服务启动类&#xff0c;方便后续扩展。 服务启动 新增的两个类如下&#xff1a; 定义一个接口IServer …

ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image

ubuntu22.04laptop OpenCV Get Started: 001_reading_displaying_write_image 1. 源由2. Read/Display/Write应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 过程分析3.1 导入OpenCV库3.2 读取图像文件3.3 显示图像3.4 保存图像文件 4. 总结5. 参考资料 1. 源由 读、写、显示图像…

基于SpringBoot的后端导出Excel文件

后端导出Excel&#xff0c;前端下载。 系列文章指路&#x1f449; 系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类 文章目录 后端导出Excel引入依赖写入响应 前端下载后端导出失败和成功返回的内容类型不同&#xff0c;因此需要分别判断。 工具类ServletUti…

第97讲:MHA高可用集群模拟主库故障以及修复过程

文章目录 1.分析主库故障后哪一个从库会切换为主库2.模拟主库故障观察剩余从库的状态2.1.模拟主库故障2.3.当前主从架构 3.修复故障的主库3.1.修复主库3.2.当前主从架构3.3.恢复MHA 1.分析主库故障后哪一个从库会切换为主库 在模拟MHA高可用集群主库故障之前&#xff0c;我们先…

外汇天眼:黑平台CCF Markets专坑华人,交钱才能出金!

一般来说&#xff0c;投资者在交易期间或多或少会都会遇到无法出金的情况&#xff0c;而平台面对这种情况&#xff0c;都会告知投资者理由&#xff0c;当然理由是五花八门的&#xff0c;有真亦有假。而有些理由一看就能判断出真假&#xff0c;如果平台方能说出这些理由&#xf…

【C语言/基础梳理/期末复习】动态内存管理(附思维导图)

目录 一、为什么要有动态内存分配 &#xff08;1&#xff09;我们已经掌握的内存方式的特点 &#xff08;2&#xff09;需求 二、malloc和free 2.1.malloc 2.1.1函数原型 2.1.2函数使用 2.1.3应用示例​编辑 2.2free 2.2.1函数原型 2.2.2函数使用 三、calloc和reallo…

【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)

Chisel环境安装教程 第一步 安装jdk&#xff0c;配置环境变量第二步 安装sbt&#xff0c;不用配置环境变量第三步 安装idea社区版第四步 离线安装scala的idea插件第五步 配置sbt换源1.切换目录2.创建repositories文件3.配置sbtconfig.txt文件 第六步 使用chisel-tutorial工程运…

mac下载工具:JDownloader 2 for Mac 中文版

JDownloader是一款开源的下载管理工具&#xff0c;主要使用Java编程语言开发&#xff0c;因此它能够在支持Java的操作系统上运行&#xff0c;包括Windows、Linux和Mac OS。这款软件专门为那些需要通过网盘下载文件的用户提供便利&#xff0c;它支持众多流行的网盘服务&#xff…

静态路由与策略路由

文章目录 概要静态路由策略路由区别分析使用场景 概要 静态路由、策略路由 静态路由 静态路由是网络管理员手动配置的路由。 策略路由 策略路由则是根据数据包的具体内容&#xff0c; 如源地址、目标地址等信息&#xff0c;进行特定的路由选择。 区别分析 通俗理解 静态…

Sui上TVL突破5亿美元,位列DeFi榜单前十名和最活跃链前五名

2023年Sui上DeFi协议迅速增长&#xff0c;2024年这一势头仍在继续&#xff0c;根据DeFiLlama报告Sui上TVL近期超过5亿美元。在不到一年的时间里就达到这个金额&#xff0c;得益于Sui的突破性指标&#xff0c;比如其峰值TPS接近6,000。 Sui TVL突破5亿美元&#xff0c;登上DeFi…

ROS从入门到精通4-1:Docker安装与常用命令总结

目录 0 专栏介绍1 Docker与机器人应用2 Docker安装步骤3 Docker常用命令3.1 创建与启动容器3.2 暂停与删除容器3.3 容器文件拷贝3.4 构建镜像与上下文 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS进…