在物联网(IoT)场景中,我们面临几个天然问题:
MQTT(Message Queuing Telemetry Transport) 正是为这些问题而生的。
它的核心优势可以用 6 个字概括:
轻量、稳定、省流量
MQTT 是一种 基于发布/订阅(Pub/Sub)模型的应用层消息协议,运行在 TCP 之上。
| 角色 | 说明 |
|---|---|
| Publisher | 消息发布者(设备、服务) |
| Subscriber | 消息订阅者 |
| Broker | 消息中转中心(服务器) |
设备之间不直接通信,一切通过 Broker 转发
设备A ---> Broker ---> 设备B
发布 订阅
这是 MQTT 能支撑大规模设备的关键原因。
Topic 是 MQTT 的“路由规则”,非常重要。
/ 分层示例:
device/locker/12345/status
device/locker/12345/cmd
| 通配符 | 含义 |
|---|---|
+ |
单层匹配 |
# |
多层匹配(只能在末尾) |
示例:
device/+/+/status
device/locker/#
QoS 是 MQTT 的核心特性之一,用来平衡 可靠性与性能。
| QoS | 语义 | 是否重传 | 适用场景 |
|---|---|---|---|
| 0 | 至多一次 | ❌ | 实时数据 |
| 1 | 至少一次 | ✅ | 业务消息 |
| 2 | 恰好一次 | ✅(两阶段) | 金融/计费 |
⚠️ QoS 越高,性能越差,千万不要滥用 QoS 2
CONNECT -> PINGREQ -> PINGRESP
遗嘱机制用于 异常下线检测。
示例:
如果我掉线了,
请帮我往 device/locker/12345/status
发一条 "offline"
典型用途:
Retain 的作用:
让新订阅者立即拿到最后一条有效消息
适合场景:
| 版本 | 特点 |
|---|---|
| MQTT 3.1 | 早期版本 |
| MQTT 3.1.1 | 最常用,事实标准 |
| MQTT 5.0 | 属性增强、原因码、共享订阅 |
⚠️ 实际工程中:设备 3.1.1,服务端可 5.0
device/{type}/{id}/data
device/{type}/{id}/cmd
device/{type}/{id}/status
| Broker | 特点 |
|---|---|
| EMQX | 功能最全,企业级 |
| Mosquitto | 轻量、简单 |
| HiveMQ | 商业化成熟 |
| Akiro MQTT | 高性能,国产方案 |
百万级设备:必须关注内存、FD、内核参数
❌ 每个设备一个 Topic 但无层级设计
❌ QoS 2 滥用
❌ ClientId 重复
❌ KeepAlive 设置过小
❌ Retain 用错导致“脏数据”
MQTT 并不是“简单的消息协议”,而是一套 为海量设备而设计的工程级通信体系。
学 MQTT 的正确路径:




