222 lines
7.2 KiB
Markdown
Raw Normal View History

2025-04-08 18:46:12 +08:00
# paho-mqtt
[MQTT](http://mqtt.org/)Message Queuing Telemetry Transport消息队列遥测传输协议是一种基于发布/订阅publish/subscribe模式的“轻量级”通讯协议该协议构建于TCP/IP协议上由 IBM 在 1999 年发布。
## 1、介绍
[Paho MQTT](http://www.eclipse.org/paho/downloads.php) 是 Eclipse 实现的 MQTT 协议的客户端,本软件包是在 Eclipse [paho-mqtt](https://github.com/eclipse/paho.mqtt.embedded-c) 源码包的基础上设计的一套 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`
![](./doc/image/paho-mqtt-menuconfig.png)
### 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 服务器 URIQOS 消息服务质量,既可完成 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 客户端。
- 函数原型:
```C
int paho_mqtt_start(MQTTClient *client)
```
- 函数参数:
|参数 |描述|
|:----- |:----|
|client |MQTT 客户端实例对象|
|return |0 : 成功; 其他 : 失败|
### 5.5 MQTTPublish 接口
- 功能: 向指定的 topic 主题发布 MQTT 消息。
- 函数原型:
```C
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 服务器。
## 7、参考资料
- [MQTT 官网](http://mqtt.org/)
- [Paho 官网](http://www.eclipse.org/paho/downloads.php)
- [IBM MQTT 介绍](https://www.ibm.com/developerworks/cn/iot/iot-mqtt-why-good-for-iot/index.html)
- [Eclipse paho.mqtt 源码](https://github.com/eclipse/paho.mqtt.embedded-c)