1. MQTT协议基础

1.1 MQTT简介

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种基于发布/订阅模式的轻量级消息传输协议,由IBM于1999年开发,2014年成为OASIS标准。它专为低带宽、高延迟、不可靠网络环境下的物联网设备通信而设计,是IoT领域事实上的标准协议。

核心定位:MQTT不是点对点通信协议,而是通过中央代理(Broker)实现多对多消息分发的协议。ThingsBoard平台内置了完整的MQTT Broker功能,支持设备直接接入。
特性 描述 IoT场景价值
轻量级 最小报文仅2字节固定头 适合MCU、传感器等资源受限设备
双向通信 设备可发布数据,也可订阅指令 遥测上报 + 远程控制
异步解耦 发布者与订阅者无需同时在线 设备离线时消息不丢失
QoS保障 三种服务质量等级 按需选择可靠性
保留消息 新订阅者立即获取最新状态 设备状态同步
遗嘱消息 异常断开时自动发布预设消息 设备离线告警

1.2 发布/订阅模型

MQTT采用主题(Topic)作为消息路由的核心机制。发布者将消息发送到特定主题,Broker负责将消息转发给所有订阅该主题的客户端。这种模型实现了空间解耦、时间解耦、同步解耦三大优势。

MQTT 发布/订阅模型架构 发布者 温度传感器 订阅者 A 仪表盘 订阅者 B 告警服务 订阅者 C 数据存储 MQTT Broker ThingsBoard 主题: sensor/temp 发布消息 转发 转发 转发 关键特性: • 发布者与订阅者完全解耦,无需知道对方存在 • 一个主题可被多个订阅者订阅,实现一对多分发
ThingsBoard中的主题结构:ThingsBoard使用标准MQTT主题前缀来区分不同功能。例如,设备遥测数据发布到 v1/devices/me/telemetry,属性上报发布到 v1/devices/me/attributes,RPC指令订阅 v1/devices/me/rpc/request/+。

1.3 QoS等级

MQTT定义了三种服务质量等级(Quality of Service),用于控制消息传递的可靠性。QoS等级越高,消息传递的保障越强,但网络开销也越大。

QoS等级 名称 发送次数 确认机制 消息去重 适用场景
0 至多一次 1次 无确认 不保证 传感器高频数据(温度、湿度),允许少量丢失
1 至少一次 ≥1次 PUBACK 可能重复 设备状态上报,允许重复但必须到达
2 恰好一次 2次握手 PUBREC/PUBREL/PUBCOMP 严格去重 计费指令、关键控制命令,不允许丢失或重复
ThingsBoard实践建议:在ThingsBoard中,设备遥测数据发布建议使用QoS 1,确保数据不丢失;RPC响应建议使用QoS 0或QoS 1;属性更新建议使用QoS 1。避免在大量高频数据中使用QoS 2,否则会显著增加Broker负载。

1.4 保留消息

保留消息(Retained Message)是MQTT的一个重要特性。当发布者将消息的保留标志位(Retain Flag)设为true时,Broker会将该消息作为该主题的最新状态持久化存储。任何新订阅该主题的客户端会立即收到这条保留消息,无需等待下一次发布。

  • 典型场景:设备状态、配置参数、传感器最新读数
  • 清除保留消息:向该主题发布一条空消息(payload长度为0)且Retain标志为true
  • ThingsBoard中的使用:设备属性(Attributes)的shared范围天然具有保留语义,但MQTT保留消息可用于自定义主题
保留消息工作流程 时间 → 发布者 发布 Retain=true Broker 存储保留消息 新订阅者 订阅同一主题 Broker 立即推送保留消息 保留消息特点 • 每个主题只保留1条 • 新订阅者立即收到 • 发布新保留消息会覆盖 • 空消息可清除保留

1.5 遗嘱消息

遗嘱消息(Will Message)是MQTT为处理客户端非正常断开而设计的机制。客户端在建立连接时,可以在CONNECT报文中指定一个遗嘱主题和遗嘱消息。当Broker检测到客户端异常断开(如网络中断、设备掉电、心跳超时)时,会自动向该遗嘱主题发布预设的遗嘱消息。

ThingsBoard中的遗嘱应用:在ThingsBoard中,设备可以通过遗嘱消息实现离线告警。例如,设备连接时设置遗嘱主题为 v1/devices/me/attributes,遗嘱消息为 {"online": false}。当设备异常断开时,ThingsBoard自动收到该消息,更新设备在线状态,触发告警规则。
连接状态 Broker行为 遗嘱消息是否发送
正常断开(发送DISCONNECT) 清理会话,不发送遗嘱 否
网络中断/心跳超时 等待Keep Alive超时后,发送遗嘱 是
设备掉电/崩溃 TCP连接断开,发送遗嘱 是
Broker主动踢出 发送遗嘱 是

遗嘱消息的配置参数:

  • Will Topic:遗嘱消息发布的主题
  • Will Payload:遗嘱消息的内容(通常为JSON格式的状态数据)
  • Will QoS:遗嘱消息的服务质量等级(建议QoS 1或2)
  • Will Retain:遗嘱消息是否作为保留消息(建议设为true,确保新订阅者也能感知设备离线)
注意事项:遗嘱消息只在非正常断开时触发。如果设备正常调用DISCONNECT报文断开连接,Broker不会发送遗嘱消息。因此,设备在正常关机时应主动发布一条"离线"状态消息,而不是依赖遗嘱机制。

1.6 小结

MQTT协议的这五大基础特性构成了IoT通信的基石:

  • 发布/订阅模型实现了设备与平台之间的解耦通信
  • QoS等级提供了灵活的消息可靠性选择
  • 保留消息确保了新订阅者能立即获取最新状态
  • 遗嘱消息为设备异常离线提供了自动通知机制