RTT之MQTT学习笔记

一 协议基础

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一次心跳收不到就断开连接,这太暴力,多次心跳没应答才断开连接才合理;

  

原文地址:https://www.cnblogs.com/jieruishu/p/14611860.html