内容提要
MQTT是物联网事实标准,基于发布/订阅模型,通过Broker解耦,报文仅2字节。支持QoS三级、遗嘱消息与保留消息,专为低功耗弱网设计。5.0版增加原因码、共享订阅等。较HTTP更省电、支持实时推送。
延伸解读
MQTT 与 HTTP 的本质差异
MQTT 采用发布/订阅模型,通过 Broker 解耦,支持云端主动推送,而 HTTP 是请求/响应模式,云端无法主动下发指令,只能靠设备轮询,导致延迟和资源浪费。此外,MQTT 报文最小仅 2 字节,远小于 HTTP 的数百字节头部,且专为低功耗弱网设计,更适合物联网场景。
QoS 等级的选择策略
MQTT 提供三级 QoS:QoS 0 最多一次,适合高频可丢数据;QoS 1 至少一次,可能重复,需幂等处理;QoS 2 恰好一次,开销最大。实际投递时取发布端和订阅端 QoS 的较低值,因此排查消息丢失问题时需同时检查两端设置。工程上默认 QoS 1 是常见折中。
MQTT 5.0 的关键改进
MQTT 5.0 相比 3.1.1 增加了原因码、属性系统、共享订阅、消息过期等特性。共享订阅支持负载均衡,消息过期避免设备上线时收到过时指令,原因码让错误排查更清晰。新项目建议直接采用 5.0,以利用这些工程化改进。
使用公共 Broker 的注意事项
文章示例使用公共测试 Broker(如 broker.emqx.io),但强调公共 Broker 是共享的,切勿发送敏感数据。正式项目应自建或购买 Broker 服务,并开启 TLS 加密与账号鉴权,确保通信安全。
Q&A
MQTT是什么?为什么它成为物联网的事实标准?
MQTT是一种轻量级的发布/订阅消息传输协议,专为低带宽、高延迟、不稳定的网络环境设计。它于1999年由IBM的Andy Stanford-Clark和Arcom公司的Arlen Nipper开发,最初用于通过卫星链路监控石油管道。MQTT报文最小仅2字节,支持QoS分级、遗嘱消息、保留消息等机制,能有效节省电量和带宽,因此成为物联网设备通信的事实标准。
MQTT的发布/订阅模型和HTTP的请求/响应模型有什么区别?
HTTP采用请求/响应模式,客户端必须主动发起请求,服务器无法主动推送数据,且头部开销大、功耗高。MQTT采用发布/订阅模式,设备通过Broker解耦,发布者发送消息到主题,订阅者接收感兴趣的主题,支持云端主动推送,报文开销小,更适合海量设备、弱网和低功耗场景。
MQTT的QoS级别有哪些?分别适用于什么场景?
MQTT提供三个QoS级别:QoS 0(最多一次)不确认不重发,可能丢消息,适合高频且可丢失的数据如实时传感器值;QoS 1(至少一次)保证到达但可能重复,适合告警、状态变更等需要可靠但可容忍重复的消息;QoS 2(恰好一次)通过四次握手保证不重不丢,但开销最大,适合计费等严格要求不重复的场景。
MQTT的遗嘱消息(LWT)和保留消息(Retained)分别有什么作用?
遗嘱消息(LWT)是客户端在连接时登记的,当设备异常掉线时,Broker会代它发布这条消息,通知其他订阅者设备离线。保留消息(Retained)是发布时设置Retain标志,Broker会保存该主题的最后一条消息,新订阅者订阅时立即收到,常用于设备状态上报,让新上线的订阅者能立即获取最新状态。
MQTT 5.0相比3.1.1有哪些重要改进?
MQTT 5.0在保持轻量化的同时增加了多项功能:原因码(Reason Code)提供更明确的错误信息;属性系统(Properties)允许携带元数据;共享订阅(Shared Subscription)实现负载均衡;消息过期(Message Expiry Interval)避免过时消息;还有主题别名、流量控制、服务端主动断开通知等。新项目建议直接使用5.0。
MQTT的Keep Alive机制是如何工作的?
客户端在连接时设置Keep Alive间隔(如60秒),空闲时发送PINGREQ心跳包,Broker回复PINGRESP。如果Broker在1.5倍Keep Alive时间内未收到客户端任何消息,则判定客户端死亡,断开连接并触发遗嘱消息。
MQTT的Clean Session(或MQTT 5.0的Clean Start和Session Expiry)有什么作用?
Clean Session标志决定Broker是否保留客户端的会话状态。设为0(持久会话)时,Broker会记住订阅关系和离线期间错过的QoS 1/2消息,重连后补发;设为1则重连后一切从零开始。MQTT 5.0将其拆分为Clean Start和Session Expiry Interval,允许更精确地控制会话保留时间。
MQTT的报文结构是怎样的?为什么说它很轻量?
MQTT报文由固定报头、可变报头和有效载荷组成。固定报头第一个字节包含报文类型和标志位,之后是变长编码的剩余长度字段,最小仅1字节。因此,一个心跳包总共只有2字节,相比HTTP动辄几百字节的头部,极大节省了带宽。
MQTT的Topic和通配符如何使用?
Topic是UTF-8字符串,用/分层,如home/livingroom/temperature。订阅时支持两种通配符:+匹配单层,如home/+/temperature匹配客厅和卧室的温度;#匹配多层,只能放在末尾,如home/#匹配home下的所有主题。
MQTT的Broker在系统中扮演什么角色?为什么设备不需要公网IP?
Broker是MQTT系统的核心,负责接收发布者的消息、按主题分发给订阅者,并管理连接、会话、保留消息等。设备只需主动连接Broker,无需公网IP或开放端口,因此可以轻松穿透NAT和防火墙,简化了网络配置。