【MQTT 编程】-API

文章目录

    • 1 MQTTClient_message 结构体
    • 2 创建客户端对象
    • 3 连接服务端
    • 3 设置回调函数
    • 4 发布消息
    • 5 订阅主题和取消订阅主题
      • 5.1 订阅主题
      • 5.2 取消订阅
    • 6 断开服务连接

1 MQTTClient_message 结构体

很重要的结构体,客户端应用程序发布消息和接收消息都是围绕这这个结构体展开的。
该结构体描述了MQTT消息的负载和属性等相关信息,例如消息的负载、负载长度、qos等。
结构体部分内容如下:

typedef struct
{int payloadlen;		// 负载长度void* payload;		// 负载int qos;			// 消息的qos等级int retained;		// 消息的保留标志int dup;			//  dup 标志int msgid;			// 消息标识符......
}

客户端发布消息时需要实例化一个MQTTClient_message对象,接收消息时,也是接收到一个MQTTClient_message对象。

2 创建客户端对象

在连接服务端之前,需要创建一个客户端对象,创建客户端对象使用函数MQTTClient_create,函数原型如下:

int MQTTClient_create(MQTTClient *handle,				// MQTT客户端句柄const char *serverURL,			// MQTT服务端IP地址const char *clientID,			// 客户端IDint persustence_type,			// 客户端使用的持久化类型void *persistence_context		// 持久化目录
)

返回值

成功:MQTTCLIENT_SUCCESS
失败:返回一个错误码

持久化类型:

  • MQTTCLIENT_PERSISTENCE_NONE:使用内存持久性。如果运行客户端的设备或系统出现故障或关闭,则任何传输中消息的当前状态都会丢失,并且即使在 QoS1 和 QoS2 下也可能无法传递某些消息。
  • MQTTCLIENT_PERSISTENCE_DEFAULT:使用默认的(基于文件系统)持久性机制。传输中消息的状态保存在文件系统中,并在意外故障的情况下提供一些防止消息丢失的保护。
  • MQTTCLIENT_PERSISTENCE_USER:使用特定于应用程序的持久性实现。使用这种类型的持久性可以控制应用程序的持久性机制。应用程序必须实现 MQTTClient_persistence 接口。

persistence_context:
如果使用 MQTTCLIENT_PERSISTENCE_NONE 持久化类型,则该参数应设置为NULL。如果选择的是 MQTTCLIENT_PERSISTENCE_DEFAULT 持久化类型,则该参数应设置为持久化目录的位置,如果设置为 NULL,则持久化目录就是客户端应用程序的工作目录。

3 连接服务端

客户端创建之后,就可以连接服务端了,连接服务端函数:MQTTClient_connect
函数原型

int MQTTClient_connect(MQTTClient handle,						// 客户端句柄MQTTClient_connetOption *options		// 
)

结构体中包含了keepAlive、cleanSessiion以及一个指向MQTTClient_willOption结构体对象的指针will_opts;MQTTClient_willOption结构体中包含了客户端遗嘱信息,遗嘱主题、遗嘱内容、遗嘱消息的Qos等级、遗嘱消息的保留标志等。

返回值

成功:MQTTCLIENT_SUCCESS
失败:1:连接被拒绝。不可接受的协议版本,不支持客户端的 MQTT 协议版本2:连接被拒绝:标识符被拒绝3:连接被拒绝:服务器不可用4:连接被拒绝:用户名或密码错误5:连接被拒绝:未授权6-255:保留以备将来使用

MQTTClient_connectOptions结构体

typedef struct
{int keepAliveInterval; 			//keepAliveint cleansession; 				//cleanSessionMQTTClient_willOptions *will; 	//遗嘱相关const char *username; 			//用户名const char *password; 			//密码int reliable; 					//控制同步发布消息还是异步发布消息............
} MQTTClient_connectOptions;

通常在定义 MQTTClient_connectOptions 对象时会使用MQTTClient_connectOptions_initializer 宏对其进行初始化操作;而在定义 MQTTClient_willOptions 对象时使用 MQTTClient_willOptions_initializer 宏对其初始化。

3 设置回调函数

使用MQTTClient_setCallbacks函数为应用程序设置回调函数。可以设置多个回调函数,包括:

  • 断开连接时的回调函数cl:当客户端检测到自己掉线时会执行该函数,如果将其设置为 NULL
    表示应用程序不处理断线的情况
  • 接受消息的回调函数ma:当客户端接收到服务端发送过来的消息时执
    行该函数,必须设置此函数否则客户端无法接收消息
  • 发布消息的回调函数dc:当客户端发布的消息已经确认发送时执行该回调函数,如果你的应用程序采用同步方式发布消息或者您不想检查是否成功发送时,您可以将此设置为 NULL

函数原型

int MQTTClient_setCallbacks(MQTTClient handle,void *context,MQTTClient_connectionLost *cl,MQTTClient_messageArrived *ma,MQTTClient_deliveryComplete *dc
)

函数参数

handle: 客户端句柄
context:执行回调函数的时候,会将 context 参数传递给回调函数,因为每一个回调函数都设置了一个参数用来接收 context 参数。
cl:一个 MQTTClient_connectionLost 类型的函数指针,如下:typedef void MQTTClient_connectionLost(void *context, char *cause);参数 cause 表示断线的原因,是一个字符串。ma:一个 MQTTClient_messageArrived 类型的函数指针,如下:typedef int MQTTClient_messageArrived(void *context, char *topicName,int topicLen, MQTTClient_message *message);参数 topicName 表示消息的主题名, topicLen 表示主题名的长度;参数 message 指向一个MQTTClient_message 对象,也就是客户端所接收到的消息。dc:一个 MQTTClient_deliveryComplete 类型的函数指针,如下:typedef void MQTTClient_deliveryComplete(void* context, MQTTClient_deliveryToken dt);参数 dt 表示 MQTT 消息的值,将其称为传递令牌。发布消息时(应用程序通过MQTTClient_publishMessage 函数发布消息,MQTT协议会返回给客户端应用程序一个传递令牌;应用程序可以通过将调用 MQTTClient_publishMessage()返回的传递令牌与传递给此回调的令牌进行匹配来检查消息是否已成功发布。

返回值

成功:MQTTCLIENT_SUCCESS
失败:MQTTCLIENT_FAILURE

注意:调用 MQTTClient_setCallbacks 函数设置回调必须在连接服务器之前完成!

同步消息发送与异步消息发送
前面提到了“同步发布消息”这个概念,既然有同步发布,那必然有异步发布,确实如何!那如何控制是同步发布还是异步发布呢?就是通过 MQTTClient_connectOptions 对象中的 reliable 成员控制的,这是一个布尔值,当 reliable=1 时使用同步方式发布消息,意味着必须完成当前正在发布的消息(收到确认)之后才能发布另一个消息;如果 reliable=0 则使用异步方式发布消息。
当使用 MQTTClient_connectOptions_initializer 宏对 MQTTClient_connectOptions 对象进行初始化时,
reliable 标志被初始化为 1,所以默认是使用了同步方式。

4 发布消息

使用MQTTClient_publishMessage函数发布一个消息
函数原型

int MQTTClient_publishMessage(MQTTClient handle,const char *topicName,MQTTClient_message *msg,MQTTClient_deliveryToken *dt
)

函数参数

handle:客户端句柄
topicName:主题名称,像该主题发布消息
msg:指向一个MQTTClient_message对象指针
dt:返回给应用程序的令牌

返回值

成功:回 MQTTCLIENT_SUCCESS
失败:错误返回码

5 订阅主题和取消订阅主题

5.1 订阅主题

使用函数MQTTClient_subscribe()订阅主题信息
函数原型

int MQTTClient_subscribe(MQTTClient handle,const char *topic,int qos
)

函数参数

handle:客户端句柄
topic:主题名称,客户端订阅主题
qos:Qos等级

返回值

成功:MQTTCLIENT_SUCCESS
失败:返回错误码

5.2 取消订阅

使用函数MQTTClient_unsubscribe()
函数原型

int MQTTClient_unsubscrube(MQTTClient handle,const char *topic
)

函数参数

handle: 客户端句柄
topic: 主题名称,取消订阅该主题

返回值

成功:MQTTCLIENT_SUCCESS
失败:返回错误码

6 断开服务连接

函数:MQTTClient_disconnect()
函数原型

int MQTTClient_disconnect(MQTTClient handle,int timeout
)

函数参数

handle:客户端句柄
timeout:超时时间

返回值

成功:MQTTCLIENT_SUCCESS
失败:返回错误代码

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

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

相关文章

Technitium DNS Server的基本使用1(创建主区域,A记录,开启递归查询,递归到114.114.114.114)

Technitium DNS Server Technitium DNS Server搭建 搭建请看博主的上篇博客,内外网的方法都有 链接: 内网搭建Technitium DNS Server详细教程 登陆进去是以下界面 这个界面主要是监控,有访问的时候就会有波动 创建主区域,A记录 写上主区…

Git简介和特点

目录 一、Git简介 二、Git特点 1.集中式和分布式 (1)集中式版本控制系统 (2)分布式版本控制系统 2.版本存储方式的差异 (1)直接记录快照,而非差异比较 3.近乎所有操作都是本地执行 一、Git简介 Git是目前世界上最先进的的分布式控制系统(没有之一…

CSS学习记录15

CSS下拉菜单 使用CSS创建可悬停的下拉列表。 下拉式式菜单 .dropdown类使用position:relative,当我们希望将下拉内容放置在下拉按钮的正下方(使用position:absolute)时,需要使用该类。 .dropdown-content 类保存实际的下拉内容。默认情况下它是隐藏的&#xff0…

RabbitMQ全局流量控制

RabbitMQ全局流量控制 流控机制流控是对什么进行控制?rabbitmq进程邮箱流控机制是什么? 流控原理流控原理流程 流控状态显示流控对象流控机制对象主要进程各进程状态情形分析 性能提升提升队列性能方式 当消息积压时,消息会进入到队列深处&am…

大数据平台

大数据行业应用持续升温,特别是企业级大数据市场正在进入快速发展时期。越来越多的企业期望实现数据孤岛的打通,整合海量的数据资源,挖掘并沉淀有价值的数据,进而驱动更智能的商业。随着公司数据爆发式增长,原有的数据…

鸿蒙生态的崛起:开发实践、认证路径与激励策略

目录 前言 鸿蒙生态能力和行业解决方案 1、鸿蒙创新能力 2、鸿蒙行业解决方案 中软鸿蒙生态业务布局 1、深度参与鸿蒙生态建设 2、提供一站式鸿蒙生态服务 (1)服务目录 (2)改造过程的关键点 (3)鸿…

指令遵循数据集IFEval介绍:中英双语

IFEval数据集介绍:评估大语言模型指令遵循能力 1. IFEval数据集提出的问题 随着大语言模型(如GPT-4、PaLM 2等)在自然语言任务中的广泛应用,模型的指令遵循能力(Instruction Following)成为一个重要评估指…

基于Qt的上位机通讯库

1.前言 做Qt上位机已经有两年的时间了,上位机主要是和下游器件打交道的,通过modbus、tcp、串口等协议来控制这些设备,通过一定的时序控制,完成所需要的工作流程。这其中最重要的就是通讯了,上位机开发过程中的相当一部…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本,如果是8版本操作会略有不同,下篇文章介绍安装8版本的操…

SQLServer利用QQ邮箱做SMTP服务器发邮件

环境 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) SQL Server Management Studio 15.0.18384.0 SQL Server 管理对象 (SMO) 16.100.46367.54 Microsoft .NET Framework 4.0.30319.42000 操作系统 Windows Server2019 ———————————————— 前言&#xf…

好用的网站-直接复制的文字图标不需要引入

分享一个前端不需要引入的,可以直接复制的图标网站 直接复制放在代码中 特殊符号大全,可直接复制黏贴 (shijianchuo.net)

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟,它集成了Maven和Docker,该插件的官方文档地址如下: 地址:https://github.com/spotify/dockerfile-maven 其他说明: dockerfile是用…

12.11数据结构-图

无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。 有向完全图:在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。 含有n个顶点的无向完全图有…

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址:https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64,一直下一步,选择安装的路径位置,一直下一步就安装完成了。打开Anaconda PowerShell Promp…

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉,我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录,你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…

CORDIC 算法实现 _FPGA

注&#xff1a;本文为 “CORDIC 算法” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 Cordic 算法的原理介绍 乐富道 2014-01-28 23:05 Cordic 算法知道正弦和余弦值&#xff0c;求反正切&#xff0c;即角度。 采用用不断的旋转求出对应的正弦余弦值&…

前端(vue组件)

1组件对象 1.1定义组件对象 defineComponent( {} ) 1.2注册组件 1.3使用组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…