首页 > 其他分享 >MQTT 生产者(同步)代码解读

MQTT 生产者(同步)代码解读

时间:2023-06-20 09:45:16浏览次数:52  
标签:char const MQTTClient 生产者 解读 int MQTT 消息

一、问题引入

官方给出了MQTT Client的同步和异步发布的例子,本随笔就是同步发布的example。同步和异步都有一套API函数和结构体。

同步发布消息算是最简单的案例了,这里总结一下代码。

二、解决过程

简要介绍编写 MQTT Producer的消息发布(同步)过程:

  • 第1步:创建客户端
LIBMQTT_API int MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId,
		int persistence_type, void* persistence_context);
  • 第2步:设置客户端与服务器的连接选项属性
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;

conn_opts.keepAliveInterval = 30;
//conn_opts的其它选项
  • 第3步:连接服务器
LIBMQTT_API int MQTTClient_connect(MQTTClient handle, MQTTClient_connectOptions* options);
  • 第4步:设置消息发布选项属性
MQTTClient_message pubmsg = MQTTClient_message_initializer;

pubmsg.qos = 1;
//pubmsg的其他选项
  • 第5步:发布消息
LIBMQTT_API int MQTTClient_publishMessage(MQTTClient handle, const char* topicName, 
        MQTTClient_message* msg, MQTTClient_deliveryToken* dt);
  • 第6步:等待消息发布完成(同步消息发布模式才有这一步)
LIBMQTT_API int MQTTClient_waitForCompletion(MQTTClient handle, MQTTClient_deliveryToken dt, unsigned long timeout);
  • 第7步:断开与服务器的连接
LIBMQTT_API int MQTTClient_disconnect(MQTTClient handle, int timeout);
  • 第8步:释放内存
LIBMQTT_API void MQTTClient_destroy(MQTTClient* handle);

2-1 数据类型的声明

创建客户端需要定义一个客户端指针(其实是一个无类指针),客户端成功创建会申请一段内存,该指针指向这段内存,且程序结束后要进行释放

/**
 * A handle representing an MQTT client. A valid client handle is available
 * following a successful call to MQTTClient_create().
 */
typedef void* MQTTClient;

MQTTClient client;

连接客户端,需要通过一个结构体传送设置选项信息

// MQTTClient_connectOptions 类型的变量通过指定宏进行初始化
#define MQTTClient_connectOptions_initializer { {'M', 'Q', 'T', 'C'}, 8, 60, 1, 1, NULL, NULL, NULL, 30, 0, NULL,\
0, NULL, MQTTVERSION_DEFAULT, {NULL, 0, 0}, {0, NULL}, -1, 0, NULL, NULL, NULL}

MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;

MQTTClient_connectOptions结构体的成员:

成员名称 取值范围 功能
char struct_id[4] 结构体识别序号
int struct_version 0~8 结构体号码
int keepAliveInterval 心跳包时间间隔
int cleansession True or False 清除会话标志
int reliable True or False 可靠性,控制单条发送 or 批量发送
MQTTClient_willOptions* will 遗嘱功能选项
const char* username 用户名,服务器支持MQTT v3.1.1版本的用户名和密码的授权和认证机制
const char* password 密码,同上
int connectTimeout 连接超时时长
int retryInterval 消息重发时间间隔,MQTT v3.1.1以及之后的版本不要了
MQTTClient_SSLOptions* ssl 加密功能
int serverURIcount 可选服务器数量,默认是0
char* const* serverURIs 可选服务器列表,即MQTT集群功能
int MQTTVersion 0:默认3.1.1,3:3.1,4:3.1.1,5:5.0 MQTT版本
struct returned MQTT v3.1.1连接返回值
struct binarypwd 可选的二进制密码
int maxInflightMessages 传输中的最大消息数
int cleanstart MQTT v5.0版本,清除开始标志位
const MQTTClient_nameValue* httpHeaders websockets的http头部
const char* httpProxy http代理
const char* httpsProxy https代理

MQTTClient_willOptions结构体的成员

成员名称 取值范围 功能
char struct_id[4] 结构体识别序号
int struct_version 0~1 结构体号码
const char* topicName 带有遗嘱的主题
const char* message 遗嘱消息
int retained True or False 消息保留标志位
int qos 0~2 消息质量
struct payload 遗嘱消息二进制格式

消息发布中的属性通过一个结构体传送

// MQTTClient_message 类型的变量通过指定宏进行初始化
#define MQTTClient_message_initializer { {'M', 'Q', 'T', 'M'}, 1, 0, NULL, 0, 0, 0, 0, MQTTProperties_initializer }

MQTTClient_message pubmsg = MQTTClient_message_initializer;

MQTTClient_message结构体的成员

成员名称 取值范围 功能
char struct_id[4] 结构体识别序号
int struct_version 0~1 结构体号码
int payloadlen 消息长度
void* payload 消息
int qos 0~2 消息质量
int retained True or False 消息保留标志位
int dup True or False 消息副本标志,仅在接收QOS=1的消息时有效
int msgid 消息标识符
MQTTProperties properties MQTT v5.0关联的消息属性

消息发布后,会产生一个token令牌,该令牌被用作检查消息是否被分发到目的地。

typedef int MQTTClient_deliveryToken;
typedef int MQTTClient_token;

三、反思总结

验证同步发布消息是否成功,通过函数:MQTTClient_waitForCompletion() 进行阻塞判断,返回值为:MQTTCLIENT_SUCCESS 表示消息成功发布到Broker。

同步发布消息的效率很低,但可靠性很强,不会造成消息未发送完成,但消息丢失的情况。

四、参考引用

标签:char,const,MQTTClient,生产者,解读,int,MQTT,消息
From: https://www.cnblogs.com/caojun97/p/17480159.html

相关文章

  • 【web开发】PHP命名空间中的子空间和公共空间详解及相关术语解读
    前言PHP的命名空间和文件系统的结构很像,文件夹可以有子文件夹,命名空间中也可以定义子空间来描述各个空间之间的所属关系。比如:cart购物车和order订单这两个模块都处于同一个shop商城项目内,通过命名空间子空间表达关系的:<?phpnamespaceshop\cart;classDemo{ //类的成员}name......
  • Airtest图像识别测试工具原理解读&最佳实践 | 京东云技术团队
    1Airtest简介Airtest是一个跨平台的、基于图像识别的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS。Airtest框架基于一种图形脚本语言Sikuli,引用该框架后,不再需要一行行的写代码,通过截取按钮或输入框的图片,用图片组成测试场景,这种方式学习成本低,简单易上手。2......
  • Airtest图像识别测试工具原理解读&最佳实践
    1Airtest简介Airtest是一个跨平台的、基于图像识别的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS。Airtest框架基于一种图形脚本语言Sikuli,引用该框架后,不再需要一行行的写代码,通过截取按钮或输入框的图片,用图片组成测试场景,这种方式学习成本低,简单易上手......
  • .NET源码解读kestrel服务器及创建HttpContext对象流程
    .NET本身就是一个基于中间件(middleware)的框架,它通过一系列的中间件组件来处理HTTP请求和响应。因此,本篇文章主要描述从用户键入请求到服务器响应的大致流程,并深入探讨.NET通过kestrel将HTTP报文转换为HttpContext对象。通过本文,您可以了解以下内容:http的数据流转流程源码解读k......
  • MQTT Broker 比较与选型——开源与商业服务器/服务对比
    MQTTBroker比较与选型——开源与商业服务器/服务对比  编程  2020-03-20  2020-03-21  评论数: 2开源MQTTBroker对比截止2021年,物联网行业里可选的MQTTBroker有很多,除了经典的Mosquitto和AWS、Azure,百度云、阿里云、IBM等几个提供物联网MQTT接入服务的产品外......
  • 论文解读- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segment
    本篇主要解读论文“nnU-Net:Self-adaptingFrameworkforU-Net-BasedMedicalImageSegmentation”==nnU-Net:基于U-Net的自适应医学图像分割框架。实现见本专栏下其他博文。直达链接......
  • 识别一切模型RAM(Recognize Anything Model)及其前身 Tag2Text 论文解读
    总览大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~继MetaAI的SAM后,OPPO研究院发布识别一切模型(RecognizeAnythingModel,RAM):项目链接:https://recognize-anything.github.io/Demo链接:https://hugging......
  • 识别一切模型RAM(Recognize Anything Model)及其前身 Tag2Text 论文解读
    总览大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~继MetaAI的SAM后,OPPO研究院发布识别一切模型(RecognizeAnythingModel,RAM):项目链接:https://recognize-anything.github.io/Demo链接:https......
  • 三千字详解 classnames,精读源码,解读重点功能的实现
    前言本文主要讲解classnames相关的知识点。对classnames用法做了详细介绍。对classnames源码,按照功能模块进行解读。尤其对于源码中关键代码从实现层面做了解读。在总结过程中,对CSS-in-JS写法有了不同的想法,结合大佬的文章,将想法记录在了文末。文章速读阅读本篇文章,你将有......
  • 解读腾讯极速高清AR-SR的画质改善机制
    正文字数:2004 阅读时长:3分钟本文来自腾讯极速高清团队的投稿,介绍了AR-SR在对压缩后的视频进行后处理,减轻压缩带来的画质损失。欢迎通过[email protected]投稿把你的经验和思考分享给大家。文/腾讯极速高清团队视频是当前网络媒体主要形式和网络带宽资源的主要消耗......