paho-mqtt
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由 IBM 在 1999 年发布。
1、介绍
Paho MQTT 是 Eclipse 实现的 MQTT 协议的客户端,本软件包是在 Eclipse paho-mqtt 源码包的基础上设计的一套 MQTT 客户端程序。
RT-Thread MQTT 客户端功能特点:
- 断线自动重连
- pipe 模型,非阻塞 API
- 事件回调机制
- TLS 加密传输
2、获取方式
- 使用 menuconfig
RT-Thread online packages --->
IOT internet of things --->
[*] Paho MQTT: Eclipse Paho MQTT C/C++ client for Embedded platforms
[*] Enable MQTT example
[ ] Enable MQTT test
[ ] Enable support tls protocol
(1) Max pahomqtt subscribe topic handlers
pahomqtt version (latest_version)
3、示例介绍
3.1 获取示例
- 配置使能示例选项
Enable MQTT example
- 配置使能测试例程
Enable MQTT test
- 配置使能 TLS 安全传输选项
Enable support tls protocol
- 设置 MQTT 能订阅的最大 topic 主题数量
Max pahomqtt subscribe topic handlers
- 配置包版本选为最新版
latest_version
3.2 运行示例
samples/mqtt_sample.c
例程提供了一个基础的 MQTT 发布订阅演示,在 RT-Thread MSH 中运行 MQTT 示例,需要开启 MSH 的支持。
测试服务器使用 Eclipse 的测试服务器,地址 iot.eclipse.org
,端口 1883
.
- 开启 MSH
使用 menuconfig 开启 MSH 支持:
RT-Thread Components --->
Command shell --->
[*] Using module shell
[*] Using module shell in default
[ ] Only using module shell
- MSH log
启动 MQTT 客户端:
msh />
msh />mq_start
inter mqtt_connect_callback!
ipv4 address port: 1883
[MQTT] HOST = 'iot.eclipse.org'
msh />[MQTT] Subscribe #0 /mqtt/test OK!
inter mqtt_online_callback!
msh />
发布消息:
msh />
msh />mq_pub hello-rtthread
msh />mqtt sub callback: /mqtt/test hello-rtthread
msh />
4、 测试介绍
4.1 使能测试程序
tests/mqtt_test.c
测试程序提供了一个客户端
、服务器
稳定性测试的例程,
用户可以通过简单配置 MQTT 服务器 URI,QOS 消息服务质量,既可完成 MQTT 客户端和服务器端的测试。
使用 MQTT 测试程序需要在 menuconfig
中使能 Enable MQTT test
。
- 配置使能测试例程选项
Enable MQTT test
4.2 修改测试程序
将 tests/mqtt_test.c
程序中的如下配置,对应修改为您要测试的 MQTT 服务器配置信息即可。
#define MQTT_TEST_SERVER_URI "tcp://iot.eclipse.org:1883"
#define MQTT_CLIENTID "rtthread-mqtt"
#define MQTT_USERNAME "admin"
#define MQTT_PASSWORD "admin"
#define MQTT_SUBTOPIC "/mqtt/test"
#define MQTT_PUBTOPIC "/mqtt/test"
#define MQTT_WILLMSG "Goodbye!"
#define MQTT_TEST_QOS 1
4.3 运行测试程序
- 使用
mqtt_test start
命令启动 MQTT 测试程序 - 使用
mqtt_test stop
命令停止 MQTT 测试程序
运行日志如下所示:
msh />mqtt_test start
[tls]mbedtls client struct init success...
[MQTT] ipv4 address port: 1884
...
[tls]Certificate verified success...
[MQTT] tls connect success...
[MQTT] Subscribe #0 /mqtt/test OK!
test start at '946725803'
==== MQTT Stability test ====
Server: ssl://yourserverhost.com:1884
QoS : 1
Test duration(sec) : 49463
Number of published packages : 98860
Number of subscribed packages : 98860
Packet loss rate : 0.00%
Number of reconnections : 0
==== MQTT Stability test stop ====
5、 关键代码及 API 说明
5.1 订阅列表
paho mqtt 中采用订阅列表的形式进行多个 Topic 的订阅,订阅列表存储在 MQTTClient
结构体实例中,在 MQTT 启动前配置,如下所示:
... // 省略代码
MQTTClient client;
... // 省略代码
/* set subscribe table and event callback */
client.messageHandlers[0].topicFilter = MQTT_SUBTOPIC;
client.messageHandlers[0].callback = mqtt_sub_callback;
client.messageHandlers[0].qos = QOS1;
详细的代码参考 samples/mqtt_sample.c
中的 mq_start
函数。
订阅列表的最大数量是由 menuconfig
中的 Max pahomqtt subscribe topic handlers
选项进行配置的。
5.2 callback
paho-mqtt 使用 callback 的方式向用户提供 MQTT 的工作状态以及相关事件的处理, 在 MQTTClient
结构体实例中注册使用。
callback 名称 | 描述 |
---|---|
connect_callback | MQTT 连接成功的回调 |
online_callback | MQTT 客户端成功上线的回调 |
offline_callback | MQTT 客户端掉线的回调 |
defaultMessageHandler | 默认的订阅消息接收回调 |
messageHandlers[x].callback | 订阅列表中对应的订阅消息接收回调 |
用户可以使用 defaultMessageHandler
回调默认处理接收到的订阅消息,也可以使用 messageHandlers
订阅列表,为 messageHandlers
数组中对应的每一个 topic 提供一个独立的订阅消息接收回调。
5.3 MQTT_URI
paho-mqtt 中提供了 uri 解析功能,可以解析域名地址、ipv4和ipv6地址,可解析 tcp://
和 ssl://
类型的 URI,用户需要按照要求填写可用的 URI 即可。
示例 URI:
domain 类型
tcp://iot.eclipse.org:1883
ipv4 类型
tcp://192.168.10.1:1883
ssl://192.168.10.1:1884
ipv6 类型
tcp://[fe80::20c:29ff:fe9a:a07e]:1883
ssl://[fe80::20c:29ff:fe9a:a07e]:1884
5.4 paho_mqtt_start 接口
-
功能: 启动 MQTT 客户端。
-
函数原型:
int paho_mqtt_start(MQTTClient *client)
- 函数参数:
参数 | 描述 |
---|---|
client | MQTT 客户端实例对象 |
return | 0 : 成功; 其他 : 失败 |
5.5 MQTTPublish 接口
-
功能: 向指定的 topic 主题发布 MQTT 消息。
-
函数原型:
int MQTTPublish(MQTTClient *c, const char *topicName, MQTTMessage *message)
- 函数参数:
参数 | 描述 |
---|---|
c | MQTT 客户端实例对象 |
topicName | MQTT 消息发布主题 |
message | MQTT 消息内容 |
return | 0 : 成功; 其他 : 失败 |
6、注意事项
- 正确填写
MQTT_USERNAME
和MQTT_PASSWORD
如果MQTT_USERNAME
和MQTT_PASSWORD
填写错误,MQTT 客户端无法正确连接到 MQTT 服务器。