一 协议基础:
1.1会话保持
MQTT 没有假设设备或 Broker 使用了 TCP 的保活机制4,而是设计了协议层的保活机制:在 CONNECT 报文里可设置 Keepalive 字段,来设置保活心跳包 PINGREQ/PINGRESP 的发送时间间隔。当长时间无法收到设备的 PINGREQ 的时候,Broker 就会认为设备已经下线
1.2客户端离线过程中的内容的备份
重新上线后,重新收到离线期间错过的消息的设备,MQTT 设计了持久化连接:在 CONNECT 报文里可设置 CleanSession 字段为 False,则 Broker 会为终端存储:
- 设备所有的订阅
- 还未被设备确认的 QoS1 和 QoS 消息
- 设备离线时错过的消息
1.3在线状态感知
MQTT 设计了遗愿(Last Will) 消息,让 Broker 在发现设备异常下线的情况下,帮助设备发布一条遗愿消息到指定的主题。实际上在某些 MQTT 服务器的实现里 (比如 EMQ X),设备上线或下线的时候 Broker 会通过某些系统主题发布设备状态更新,更符合实际应用场景。
1.4MQTT 协议快速体验
EMQ X MQTT 物联网云服务 提供了一个在线的公共 MQTT 5.0 服务器;免费的在线 MQTT 服务器,EMQ 也提供了支持浏览器访问的 MQTT 在线客户端工具。
二 rt-thread 的MQTT组件:
2.1pipe方式理并行收发的问题;
2.2 判断离线:在4G网络,TCP数据延迟一分钟都是可能发生的。因此mqtt keepalive一次心跳收不到就断开连接,这太暴力,多次心跳没应答才断开连接才合理;