4. MQTT协议基础

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是物联网领域最主流的轻量级发布/订阅消息协议。它由IBM于1999年开发,2014年成为OASIS标准,专为低带宽、高延迟、不可靠网络环境下的设备通信而设计。在ThingsBoard平台中,MQTT是设备接入和数据采集的核心协议。

4.1 MQTT协议简介

MQTT基于TCP/IP协议栈,采用客户端-服务器架构,其中服务器称为Broker(代理/消息代理)。协议设计目标包括:最小化网络带宽消耗、降低代码占用空间、提供可靠的消息传递保障。

特性 描述 物联网场景价值
轻量级 最小报文头仅2字节 适合NB-IoT、2G/3G等窄带网络
双向通信 支持设备到云端、云端到设备 遥测上报与远程控制
异步模式 发布者与订阅者解耦 设备无需等待响应,节省功耗
会话感知 支持持久会话与离线消息 设备断线重连后数据不丢失
QoS保障 三种服务质量等级 按需选择可靠性级别
ThingsBoard提示: ThingsBoard内置MQTT Broker(默认端口1883/8883),设备可直接连接;也支持桥接外部MQTT Broker(如EMQX、Mosquitto),实现多协议网关场景。

4.2 发布/订阅模型

MQTT采用发布/订阅(Pub/Sub)模型,替代传统的客户端-服务器点对点通信。核心角色包括:

  • 发布者(Publisher): 发送消息到指定主题的设备或应用。
  • 订阅者(Subscriber): 订阅感兴趣的主题,接收该主题下的所有消息。
  • 代理(Broker): 接收发布者消息,过滤并分发给所有匹配的订阅者。

主题(Topic)是消息分类的层级结构,使用正斜杠(/)分隔,支持通配符:

  • +:单级通配符,匹配一个层级。例如 sensor/+/temperature 匹配 sensor/room1/temperature。
  • #:多级通配符,匹配剩余所有层级。例如 sensor/# 匹配 sensor/temperature、sensor/humidity/outdoor 等。
MQTT 发布/订阅模型架构 发布者 温度传感器 MQTT Broker ThingsBoard / EMQX 订阅者 仪表盘应用 订阅者 告警服务 订阅者 数据存储 发布消息 sensor/temp 转发 转发 转发 核心解耦: 发布者与订阅者无需知道对方存在,Broker负责消息路由。一个发布者可对应多个订阅者,实现一对多广播。
ThingsBoard主题约定: 设备遥测数据默认发布到 v1/devices/me/telemetry;设备属性上报到 v1/devices/me/attributes;RPC控制指令订阅 v1/devices/me/rpc/request/+。这些主题由ThingsBoard平台预定义,设备端需严格遵循。

4.3 QoS等级

服务质量(Quality of Service,QoS)定义了消息传递的可靠性级别。MQTT提供三个等级,适用于不同场景:

QoS等级 名称 发送次数 确认机制 可靠性 适用场景
0 至多一次 1次 无确认 最低 高频传感器数据(温度、湿度),允许少量丢失
1 至少一次 ≥1次 PUBACK确认 中等 设备状态上报、告警事件,确保送达但可能重复
2 恰好一次 2次握手 PUBREC/PUBREL/PUBCOMP 最高 计费指令、关键控制命令,不允许重复或丢失
性能权衡: QoS 2虽然最可靠,但网络开销是QoS 0的3-5倍。在ThingsBoard中,遥测数据默认使用QoS 1,兼顾可靠性与性能。对于大批量高频数据(如每秒上报),建议使用QoS 0以减少Broker负载。

4.4 保留消息

保留消息(Retained Message)是MQTT的一项特殊机制:发布者发送消息时设置保留标志(RETAIN=1),Broker会存储该主题的最后一条保留消息。当新订阅者订阅该主题时,Broker立即将保留消息推送给订阅者,无需等待下一次发布。

保留消息的核心用途:

  • 设备状态快照: 新接入的设备或应用立即获取最新状态,无需等待设备下次上报。
  • 配置同步: 设备上线后立即获取云端下发的配置参数。
  • 系统初始化: 仪表盘或监控系统启动时自动获取所有设备的当前值。

清除保留消息: 向同一主题发布一条空载荷(payload长度为0)且RETAIN=1的消息,即可清除该主题的保留消息。

ThingsBoard实践: 设备属性(Attributes)天然具有保留语义。使用 v1/devices/me/attributes 主题上报属性时,ThingsBoard会自动存储最新值,设备重连后可通过 v1/devices/me/attributes/request/+ 获取。对于自定义MQTT主题,可在发布时设置RETAIN标志实现类似效果。

4.5 遗嘱消息

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

遗嘱消息的触发条件:

  • 网络连接断开(TCP/IP超时)
  • 设备异常掉电,未发送DISCONNECT报文
  • Broker端Keep Alive超时

遗嘱消息的配置参数:

参数 说明 示例值
Will Topic 遗嘱消息发布的主题 v1/devices/me/telemetry
Will Payload 遗嘱消息的内容 {"online": false}
Will QoS 遗嘱消息的服务质量等级 1
Will Retain 是否保留遗嘱消息 true
遗嘱消息工作流程 IoT设备 温度传感器 MQTT Broker ThingsBoard 订阅者 告警服务 ① CONNECT (含遗嘱消息) ② 异常断开 ③ 发布遗嘱 {"online":false} 典型应用: 设备连接时设置遗嘱主题为 v1/devices/me/attributes,载荷 {"online":false},RETAIN=true。 设备正常上线时发布 {"online":true} 覆盖遗嘱状态,实现设备在线状态实时追踪。
ThingsBoard集成建议: 在设备接入时,通过MQTT CONNECT报文设置遗嘱消息,结合ThingsBoard的server-side attributes功能,可实现设备在线状态自动管理。设备正常上线时主动上报 {"online": true},异常离线时Broker自动发布 {"online": false},无需设备端额外心跳逻辑。

4.6 MQTT报文结构速览

MQTT控制报文由固定头、可变头、有效载荷三部分组成。固定头最小仅2字节:

字段 长度 说明
报文类型 4 bit CONNECT(1)、PUBLISH(3)、SUBSCRIBE(8) 等14种类型
标志位 4 bit DUP、QoS、RETAIN等标志
剩余长度 1-4字节 可变头+有效载荷的总字节数,使用变长编码

常用报文类型:

  • CONNECT: 客户端请求连接Broker,包含Client ID、用户名密码、遗嘱消息、Keep Alive等。
  • CONNACK: Broker确认连接结果,返回连接状态码(0=成功,1-5=各类失败原因)。
  • PUBLISH: 发布消息,包含主题名、载荷、QoS、RETAIN标志。
  • SUBSCRIBE: 订阅主题,包含主题过滤器列表及对应的QoS等级。
  • SUBACK: Broker确认订阅结果,返回每个主题的最大QoS等级。
  • PINGREQ/PINGRESP: 心跳保活,用于维持连接。
  • DISCONNECT: 客户端正常断开连接。