【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记录 写上主区…

OpenAI 与 ChatGPT 的关系解析

OpenAI 与 ChatGPT 的关系解析 基本关系 OpenAI 是公司,ChatGPT 是产品 OpenAI 是一家人工智能研究公司ChatGPT 是 OpenAI 开发的一款 AI 聊天产品ChatGPT 使用的是 OpenAI 开发的 GPT(Generative Pre-trained Transformer)模型 OpenAI 的…

Git简介和特点

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

CSS学习记录15

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

《国产单片机,soc的一些现实问题》

大概从口罩开始,芯片断供。在中低端市场,国外mcu,国外soc趁机抢占了大量市场份额。 但是因为大家都用国外了,价格优势依然不明显。 有一些没有核心技术的公司,或老板业务或采购出身,不懂技术。 在一堆芯片面…

AdminJS - 现代化的 Node.js 管理面板框架详解

AdminJS - 现代化的 Node.js 管理面板框架详解 什么是 AdminJS? AdminJS 是一个自动化的管理面板框架,专为 Node.js 应用程序设计。它可以让开发者快速构建功能强大的管理后台界面,而无需编写大量重复的代码。 主要特点 自动 CRUD 操作 自动生成增删…

RabbitMQ全局流量控制

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

大数据平台

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

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

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

Vue如何来处理动画

Vue 提供了多种方式来处理动画&#xff0c;使得创建动态用户界面变得简单而灵活。以下是几种关于 Vue 动画的技巧和最佳实践&#xff0c;帮助你更高效地在项目中实现动画效果&#xff1a; 1. 使用 <transition> 和 <transition-group> 组件 Vue 内置的 <trans…

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

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

Rust中自定义Debug调试输出

在 Rust 中&#xff0c;通过为类型实现 fmt::Debug&#xff0c;可以自定义该类型的调试输出。fmt::Debug 是标准库中的一个格式化 trait&#xff0c;用于实现 {:?} 格式的打印。这个 trait 通常通过自动派生&#xff08;#[derive(Debug)]&#xff09;来实现&#xff0c;但你也…

【git使用】git patch操作的常用命令:patch -p1 < xxxx.patch

patch -p1 < xxxx.patch 是一个在 Unix/Linux 系统中常用的命令&#xff0c;其主要含义如下&#xff1a; 一、patch 命令 patch 是一个用于对文件进行补丁操作的工具。补丁文件&#xff08;通常是 .patch 文件&#xff09;包含了对原始文件的修改信息&#xff0c;这些修改可…

基于Qt的上位机通讯库

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

《Kali Linux 软件源更换攻略:优化软件获取与系统更新》

KALI为什么要换源 速度提升 Kali Linux 默认的软件源服务器通常位于国外。在从这些国外源下载软件包、更新系统时&#xff0c;会受到网络带宽、网络延迟等因素的限制。例如&#xff0c;在中国&#xff0c;连接到国外服务器的网络速度可能较慢&#xff0c;尤其是在下载大型软件…

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版本&#xff0c;如果是8版本操作会略有不同&#xff0c;下篇文章介绍安装8版本的操…

RabbitMQ 安装、配置和使用介绍 使用前端js直接调用方式

1. 安装 RabbitMQ 1.1 安装 Erlang RabbitMQ 是基于 Erlang 语言开发的&#xff0c;因此首先需要安装 Erlang。 在 Ubuntu 上安装 Erlang&#xff1a; bash sudo apt-get update sudo apt-get install erlang 在 CentOS 上安装 Erlang&#xff1a; bash sudo yum insta…

PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语

中文版 PyTorch 的 torch.unbind 函数详解与进阶应用 在深度学习中&#xff0c;张量的维度操作是基础又重要的内容。PyTorch 提供了许多方便的工具来完成这些操作&#xff0c;其中之一便是 torch.unbind。与常见的堆叠函数&#xff08;如 torch.stack&#xff09;相辅相成&am…

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…

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

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