Skip to content

MQTT 协议说明 ​

MQTT(Message Queuing Telemetry Transport)是一种轻量级的物联网通信协议,基于发布/订阅模型运行在 TCP/IP 之上。它通过 Broker 解耦消息发布者与订阅者,适合低带宽、高延迟、不稳定网络以及终端算力有限的嵌入式设备场景。

MQTT 常用于物联网数据采集、M2M 通信、消息推送、智能设备、车联网、智慧城市、远程医疗、电力能源等领域。

协议特点 ​

  • 发布/订阅模型:客户端不需要知道对端地址,只需要围绕 Topic 发布或订阅消息。
  • 协议开销小:固定报头最小仅 1 字节,心跳报文开销低,适合资源受限设备。
  • 支持 QoS:提供 0、1、2 三种服务质量等级,用于在性能和可靠性之间取舍。
  • 会话保持:支持 Clean Session / 持久会话,可保存订阅状态和离线消息。
  • 心跳保活:通过 Keep Alive 与 PINGREQ / PINGRESP 检测连接状态。
  • 遗嘱消息:通过 Last Will and Testament 感知客户端异常断开并通知相关订阅者。
  • 负载透明:Payload 内容由业务定义,协议本身不强制应用层数据格式。

发布/订阅模型 ​

MQTT 通信中通常包含三个角色:

角色说明
Publisher发布者,向指定 Topic 发布消息
Subscriber订阅者,订阅 Topic 并接收匹配消息
Broker消息代理,负责连接管理、主题匹配、消息转发和会话维护

发布者和订阅者都是 MQTT Client,同一个客户端可以同时发布和订阅。Broker 是服务端,负责将发布者发送到某个 Topic 的消息分发给订阅该 Topic 的客户端。

text
Publisher ── publish(topic, payload) ──► Broker ──► Subscriber

与传统请求/响应模式相比,发布/订阅模型降低了客户端之间的耦合:客户端不需要提前知道对端 IP、端口,也不要求发布者和订阅者同时在线。

Topic 与 Payload ​

MQTT 消息主要由 Topic 和 Payload 组成:

字段说明
Topic消息主题,用于 Broker 做路由匹配,例如 factory/line1/temp
Payload消息负载,即应用层数据,格式可由业务自定义,例如 JSON、二进制、文本

Topic 通常按层级组织,使用 / 分隔路径。客户端订阅某个 Topic 后,即可收到其他客户端发布到该 Topic 的消息。

QoS 等级 ​

MQTT 支持三种消息服务质量等级:

QoS语义适用场景
QoS 0At most once,最多一次。消息依赖底层 TCP/IP 发送,不做额外确认,可能丢失高频传感器数据、允许偶发丢包的状态上报
QoS 1At least once,至少一次。确保消息到达,但可能重复需要可靠到达、业务可去重的控制或事件消息
QoS 2Exactly once,只有一次。通过四步握手保证消息只到达一次计费、交易、关键控制等对重复和丢失都敏感的场景

QoS 越高,协议交互越多,可靠性更强,但网络和处理开销也更大。实际工程中应根据业务容忍度选择合适等级。

会话与心跳 ​

客户端发起 CONNECT 时,可通过 Clean Session 控制会话行为:

  • Clean Session = 1:创建临时会话,客户端断开后会话销毁。
  • Clean Session = 0:创建持久会话,客户端断开后 Broker 保留订阅关系和离线消息,直到会话过期或被清理。

Keep Alive 用于定义客户端与 Broker 的最大空闲时间。若在该时间内没有业务报文,客户端应发送 PINGREQ,Broker 回复 PINGRESP,用于保持连接并检测异常断开。

遗嘱消息 ​

Last Will and Testament 用于处理客户端异常断开场景。客户端连接 Broker 时可提前设置遗嘱 Topic、Payload、QoS 和 Retain 标志。当 Broker 判断客户端异常离线后,会自动向遗嘱 Topic 发布该消息。

典型用途:

  • 设备离线通知;
  • 网关异常告警;
  • 业务状态清理;
  • 在线/离线状态广播。

MQTT 报文类型 ​

MQTT 由多种控制报文组成,常见报文如下:

报文说明是否包含 Payload
CONNECT客户端请求连接 Broker是
CONNACKBroker 确认连接结果否
PUBLISH发布应用消息可选
PUBACKQoS 1 发布确认否
PUBREC / PUBREL / PUBCOMPQoS 2 发布流程报文否
SUBSCRIBE订阅主题是
SUBACKBroker 返回订阅结果是
UNSUBSCRIBE取消订阅是
UNSUBACKBroker 确认取消订阅否
PINGREQ / PINGRESP心跳请求与响应否
DISCONNECT客户端主动断开否

版本与实现 ​

常见 MQTT 版本包括 MQTT 3.1.1 与 MQTT 5.0。翼辉 SylixOS libpaho_mqtt 工程移植自 Eclipse Paho MQTT C Client,可用于开发 MQTT 3.1.1 与 MQTT 5.0 客户端应用。

如果需要在 SylixOS 上开发 MQTT 应用,可继续阅读:Paho MQTT 使用指导。

参考资料 ​