|
|
@@ -1,37 +1,41 @@
|
|
|
# RyanMqtt
|
|
|
|
|
|
-**使用遇到问题可以提 issue / RT-Thread 社区提问,谢谢。**
|
|
|
+📢 **使用过程中遇到问题?欢迎提交 Issue 或在 [RT-Thread 社区](https://club.rt-thread.org/index.html) 提问,感谢支持!**
|
|
|
|
|
|
-[RT-Thread-RyanMqtt使用介绍和示例代码(一)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/51a25ba90fc5e1b5.html)
|
|
|
+- [RT-Thread-RyanMqtt使用介绍和示例代码(一)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/51a25ba90fc5e1b5.html)
|
|
|
+- [RT-Thread-RyanMqtt QOS质量测试(二)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/e95c5b9390c53cf3.html)
|
|
|
|
|
|
-[RT-Thread-RyanMqtt QOS质量测试(二)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/e95c5b9390c53cf3.html)
|
|
|
+- [RT-Thread-RyanMqtt 移植指南(三)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/611b7a947f7221cf.html)
|
|
|
+- [keil使用 RyanMQTT 编译错误(中文编码问题)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/question/7269a82662b6cf31.html)
|
|
|
|
|
|
-[RT-Thread-RyanMqtt 移植指南(三)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/611b7a947f7221cf.html)
|
|
|
|
|
|
-[keil使用 RyanMQTT 编译错误(中文编码问题)RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/question/7269a82662b6cf31.html)
|
|
|
+### 1、介绍
|
|
|
|
|
|
+**RyanMqtt** 是一个严格遵循 [MQTT 3.1.1](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html) 协议标准实现的客户端库,专为资源受限的嵌入式设备设计并优化。
|
|
|
|
|
|
-### 1、介绍
|
|
|
+初衷:在使用 [RT-Thread](https://github.com/RT-Thread/rt-thread) 开发过程中,缺乏一个功能完整且稳定可靠的 MQTT 客户端。而 MQTT 又是物联网项目中的核心通信协议。因此,基于标准协议规范与实际项目需求,设计并实现了 RyanMqtt。
|
|
|
+
|
|
|
+#### 主要特性
|
|
|
+
|
|
|
+- ✅ **严格遵循 MQTT 3.1.1 协议标准**
|
|
|
+- ✅ **高质量代码保障** , 引入 **[clang-tidy](https://clang.llvm.org/extra/clang-tidy/#clang-tidy)** 与 **[Cppcheck](https://cppcheck.sourceforge.io/)** 进行静态分析,实现接近语法级“零缺陷”,提升可维护性
|
|
|
+- ✅ **AI 辅助开发与审查**,使用 **[coderabbitai](https://www.coderabbit.ai)** 和 **[Copilot](https://github.com/features/copilot)** 辅助编码与代码审查,持续优化代码质量,构建安全防线
|
|
|
+- ✅ **支持多客户端实例**,适用于复杂应用场景
|
|
|
+- ✅ **全等级 QoS 支持(QoS0/1/2)**,并提供**用户可控的消息丢弃机制**,避免因 QoS1/QoS2 消息重传导致内存无限堆积
|
|
|
+- ✅ **完整的主题通配符支持**:`/`、`#`、`+`、`$`
|
|
|
+- ✅ 支持批量订阅 / 取消订阅
|
|
|
+- ✅ 可配置 KeepAlive、自动重连、LWT(遗嘱消息)、Clean Session 等功能
|
|
|
+- ✅ 丰富的参数配置与事件回调接口,满足绝大多数实际项目需求(欢迎提出新需求)
|
|
|
+- ✅**高性能与高并发能力:**经测试,在 Linux 环境下可稳定发送/接收连续 20,000 条 QoS2 消息,
|
|
|
|
|
|
-RyanMqtt 实现了 [MQTT 3.1.1](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html) 协议的客户端。此库针对资源受限的嵌入式设备进行了优化。
|
|
|
-
|
|
|
-初衷:在使用[RT-Thread](https://github.com/RT-Thread/rt-thread)时,没有非常合适的 mqtt 客户端。项目中 mqtt 又是非常核心的功能。参考 MQTT3.1.1 标准和项目需求设计的 mqtt 客户端,它拥有以下特点。
|
|
|
-
|
|
|
-- **严格遵循 [MQTT 3.1.1](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html) 协议标准实现**
|
|
|
-- **代码规范** 引入 **[clang-tidy](https://clang.llvm.org/extra/clang-tidy/#clang-tidy)** 和 **[Cppcheck](https://cppcheck.sourceforge.io/)** 静态代码分析, 接近语法级“零缺陷”,提升可维护性
|
|
|
-- 使用 **[coderabbitai](https://www.coderabbit.ai)** 和 **[Copilot](https://github.com/features/copilot)** 进行代码审查,持续提升代码质量,构筑安全防线
|
|
|
-- 支持多客户端
|
|
|
-- **稳定的全 QOS 等级实现消息实现**。**用户可控的消息丢弃机制**,避免 Qos2 / Qos1 消息无限堆积重发消耗的内存空间
|
|
|
-- **完整的 MQTT 主题通配符支持,“/”、“#”、“+”、“$”**
|
|
|
-- 支持批量订阅 / 取消订阅
|
|
|
-- 可选择的 keepalive、reconnect、lwt、session 等
|
|
|
-- 客户端多功能参数配置,丰富的用户可选的事件回调,满足实际项目的绝大部分需求(欢迎提需求)
|
|
|
-- 优化过的并发能力,**无等待的连续 20000 条 RyanMqttQos2 消息稳定发送和接收无一丢包**(测试环境为linux,实际情况会受到单片机内存大小和网络硬件的收发能力的影响)
|
|
|
-- **复杂线程环境下稳定运行**,已在公司多个项目使用
|
|
|
-- 跨平台,只需实现少量的平台接口即可
|
|
|
-- 资源占用少,依赖少
|
|
|
-- 没有内置 TLS 支持,用户可以在platform层实现 TLS(使用 TLS 的项目也不会只有 mqtt 使用,用户自己实现可以防止 TLS 模块间冲突)
|
|
|
-- **不支持裸机平台**,裸机想要稳定的 [MQTT 3.1.1](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html) 实现可以参考[coreMQTT](https://github.com/FreeRTOS/coreMQTT)
|
|
|
+ 无一丢包。
|
|
|
+
|
|
|
+ > ⚠️ 实际性能受单片机内存大小及网络硬件能力影响
|
|
|
+- ✅ **复杂线程环境下稳定运行**,已在多个商业项目中长期使用验证
|
|
|
+- ✅ **跨平台设计**,仅需实现少量平台接口即可移植
|
|
|
+- ✅ **低资源占用,依赖极少**
|
|
|
+- ❌ **无内置 TLS 支持**:TLS 需由用户在平台层自行实现(避免模块冲突,适配多业务共用 TLS 的场景)
|
|
|
+- ❌ **不支持裸机平台**:建议裸机系统使用 coreMQTT 等更适合无操作系统环境的实现
|
|
|
|
|
|
### 2、设计
|
|
|
|
|
|
@@ -39,40 +43,42 @@ RyanMqtt 设计时参考了[mqttclient](https://github.com/jiejieTop/mqttclient)
|
|
|
|
|
|

|
|
|
|
|
|
-- **平台兼容层**封装不同操作系统内核接口,方便实现跨平台
|
|
|
-- **核心库**基于 [coreMQTT](https://github.com/FreeRTOS/coreMQTT) 实现 MQTT 报文序列化与处理
|
|
|
-- **核心线程**是每个客户端必须创建的线程,统一处理客户端所有的操作,比如 mqtt 状态机、事件回调、心跳保活、消息解析、消息超时处理、消息重发等
|
|
|
-- **系统服务管理模块**提供 RyanMqtt 实现功能的工具,包含 session 状态、事件处理、通配符匹配、消息链表等
|
|
|
-- **用户应用模块**提供给用户调用的丰富的接口,包含 RyanMqtt 客户端申请 / 销毁、mqtt 多参数配置、事件注册 / 注销、QOS 消息丢弃、 mqtt 连接 / 停止 / 重连 / 发布 / 订阅 / 取消订阅等
|
|
|
+| 模块 | 说明 |
|
|
|
+| -------------------- | ------------------------------------------------------------ |
|
|
|
+| **平台兼容层** | 封装不同操作系统内核接口,实现跨平台支持 |
|
|
|
+| **核心库** | 基于 [coreMQTT](https://github.com/FreeRTOS/coreMQTT) 实现 MQTT 报文的序列化与解析 |
|
|
|
+| **核心线程** | 每个客户端独占一个线程,统一处理状态机、事件回调、心跳保活、消息解析、超时重传等逻辑 |
|
|
|
+| **系统服务管理模块** | 提供会话管理、事件调度、通配符匹配、消息链表管理等基础服务 |
|
|
|
+| **用户应用模块** | 向用户提供完整的 API 接口,包括客户端生命周期管理、连接控制、发布/订阅、事件注册等 |
|
|
|
|
|
|
### 3、平台接口
|
|
|
|
|
|
-_RyanMqtt 库希望应用程序为以下接口提供实现:_
|
|
|
+_RyanMqtt 依赖于用户实现以下三类平台接口,以确保在不同系统中正常运行。_
|
|
|
|
|
|
-#### system 接口
|
|
|
+#### System 接口(RTOS 必需)
|
|
|
|
|
|
_RyanMqtt 需要 RTOS 支持,必须实现如下接口才可以保证 mqtt 客户端的正常运行_
|
|
|
|
|
|
-| 函数名称 | 函数简介 |
|
|
|
-| ----------------------- | -------------- |
|
|
|
-| platformMemoryMalloc | 申请内存 |
|
|
|
-| platformMemoryFree | 释放已申请内存 |
|
|
|
-| platformDelay | 毫秒延时 |
|
|
|
-| platformPrint | 打印字符串 |
|
|
|
-| platformThreadInit | 初始化线程 |
|
|
|
-| platformThreadDestroy | 销毁线程 |
|
|
|
-| platformThreadStart | 开启线程 |
|
|
|
-| platformThreadStop | 挂起线程 |
|
|
|
-| platformMutexInit | 初始化互斥锁 |
|
|
|
-| platformMutexDestroy | 销毁互斥锁 |
|
|
|
-| platformMutexLock | 获取互斥锁 |
|
|
|
-| platformMutexUnLock | 释放互斥锁 |
|
|
|
-| platformCriticalInit | 初始化临界区 |
|
|
|
-| platformCriticalDestroy | 销毁临界区 |
|
|
|
-| platformCriticalEnter | 进入临界区 |
|
|
|
-| platformCriticalExit | 退出临界区 |
|
|
|
-
|
|
|
-#### network 接口
|
|
|
+| 函数名称 | 函数简介 |
|
|
|
+| ----------------------- | ------------ |
|
|
|
+| platformMemoryMalloc | 动态内存分配 |
|
|
|
+| platformMemoryFree | 释放内存 |
|
|
|
+| platformDelay | 毫秒延时 |
|
|
|
+| platformPrint | 打印字符串 |
|
|
|
+| platformThreadInit | 初始化线程 |
|
|
|
+| platformThreadDestroy | 销毁线程 |
|
|
|
+| platformThreadStart | 开启线程 |
|
|
|
+| platformThreadStop | 挂起线程 |
|
|
|
+| platformMutexInit | 初始化互斥锁 |
|
|
|
+| platformMutexDestroy | 销毁互斥锁 |
|
|
|
+| platformMutexLock | 获取互斥锁 |
|
|
|
+| platformMutexUnLock | 释放互斥锁 |
|
|
|
+| platformCriticalInit | 初始化临界区 |
|
|
|
+| platformCriticalDestroy | 销毁临界区 |
|
|
|
+| platformCriticalEnter | 进入临界区 |
|
|
|
+| platformCriticalExit | 退出临界区 |
|
|
|
+
|
|
|
+### Network 接口(网络通信必需)
|
|
|
|
|
|
_RyanMqtt 依赖于底层传输接口 API,必须实现该接口 API 才能在网络上发送和接收数据包_
|
|
|
|
|
|
@@ -87,29 +93,29 @@ _MQTT 协议要求基础传输层能够提供有序的、可靠的、双向传
|
|
|
| platformNetworkSendAsync | 非阻塞发送数据 |
|
|
|
| platformNetworkClose | 断开 mqtt 服务器连接 |
|
|
|
|
|
|
-#### time 接口
|
|
|
+> 🔐 如需 TLS 加密,请在 `platformNetworkConnect` 等接口中集成 TLS 层(如 mbedTLS、wolfSSL 等)
|
|
|
+
|
|
|
+### Time 接口
|
|
|
|
|
|
_RyanMqtt 依靠函数生成毫秒时间戳,用于计算持续时间和超时,内部已经做了数值溢出处理_
|
|
|
|
|
|
-| 函数名称 | 函数简介 |
|
|
|
-| ---------------- | ------------------------ |
|
|
|
-| platformUptimeMs | 自系统启动以来 ms 时间戳 |
|
|
|
+| 函数名称 | 函数简介 |
|
|
|
+| ---------------- | ---------------------------- |
|
|
|
+| platformUptimeMs | 返回系统启动以来的毫秒时间戳 |
|
|
|
|
|
|
### 4、示例
|
|
|
|
|
|
#### RT-Thread 平台
|
|
|
|
|
|
-- 接口示例请参考 platform/rtthread 文件夹
|
|
|
-
|
|
|
-- RyanMqtt 使用示例请参考 example 文件夹
|
|
|
-
|
|
|
-- 需要使能 SAL,示例使用 socket 接口进行数据收发。
|
|
|
+- 平台接口实现参考:`platform/rtthread/`
|
|
|
|
|
|
-- 需要 MSH 组件,示例默认挂载到 MSH 组件
|
|
|
+- 使用示例参考:`example/`
|
|
|
+- 需启用 **SAL(Socket Abstraction Layer)组件**,示例基于 Socket 接口收发数据
|
|
|
+- 需启用 **MSH(命令行组件)**,示例默认集成至 MSH
|
|
|
|
|
|
- **详细使用请参考 example,提供了一些测试接口和使用范例**
|
|
|
+> 📌 **强烈建议参考 `example` 目录中的测试接口与使用范例,获取完整使用指导**
|
|
|
|
|
|
- 
|
|
|
+
|
|
|
|
|
|
#### 合宙openLuat平台
|
|
|
|
|
|
@@ -129,8 +135,25 @@ _RyanMqtt 依靠函数生成毫秒时间戳,用于计算持续时间和超时
|
|
|
|
|
|
### 5、依赖
|
|
|
|
|
|
-暂无
|
|
|
+本项目 **无外部第三方库依赖**,仅依赖用户实现的平台接口。
|
|
|
+
|
|
|
+### 6、免责声明
|
|
|
+
|
|
|
+> ⚠️ **重要提示**
|
|
|
+
|
|
|
+请**勿将本库用于支付、金融交易或其他可能造成重大损失的场景**。
|
|
|
+ 尽管 RyanMqtt 的 QoS2 消息机制经过大量测试验证,但在实际应用中,由于以下因素可能导致消息不可靠:
|
|
|
+
|
|
|
+- 网络波动剧烈甚至无法建立稳定连接
|
|
|
+- MQTT 服务端配置策略(如超时、限流、会话清理)
|
|
|
+- 客户端或服务端资源不足
|
|
|
+
|
|
|
+因此,**不能仅依赖 QoS2 保证数据安全与一致性**。
|
|
|
+ **强烈建议在应用层实现数据校验、幂等处理与最终一致性机制**。
|
|
|
+
|
|
|
+> 🛑 **作者不对因使用本库导致的任何直接或间接损失承担责任。请在深度评估后谨慎使用。**
|
|
|
+
|
|
|
+
|
|
|
|
|
|
-### 6、声明
|
|
|
+如需进一步帮助,请访问 [RT-Thread 社区](https://club.rt-thread.org/index.html) 或联系作者。
|
|
|
|
|
|
-- 请勿将此库 QOS 消息等级用于**支付等可能造成重大损失**的场景,如需使用请自行**深度评估后使用!!!作者不对使用此库造成的任何损失负责。不要只依靠 qos2 来保证安全!!!**。(尽管此库 RyanMqttQos2 消息等级经过很多测试,但是异步组件由于诸多因素例如波动非常大的网络甚至无法建立稳定连接、mqtt 服务端的策略配置等,无法做到绝对的准确性。需要用户用应用层做到数据的最终一致性。)
|