..
2025-04-08 18:46:12 +08:00
2025-04-08 18:46:12 +08:00
2025-04-08 18:46:12 +08:00
2025-04-08 18:46:12 +08:00
2025-04-08 18:46:12 +08:00
2025-04-08 18:46:12 +08:00

paho-mqtt

MQTTMessage 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 服务器 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 客户端。

  • 函数原型:

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_USERNAMEMQTT_PASSWORD
    如果 MQTT_USERNAMEMQTT_PASSWORD 填写错误MQTT 客户端无法正确连接到 MQTT 服务器。

7、参考资料