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负责将消息转发给所有订阅该主题的客户端。这种模型实现了空间解耦、时间解耦、同步解耦三大优势。
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保留消息可用于自定义主题
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等级提供了灵活的消息可靠性选择
- 保留消息确保了新订阅者能立即获取最新状态
- 遗嘱消息为设备异常离线提供了自动通知机制