一、背景:为什么物联网需要 MQTT
1.1 HTTP 在物联网场景下的问题
以温度传感器为例,每 10 秒上报一次,一天约 8,600 多次请求:
| 问题 | 说明 |
|---|
| 头部开销过大 | HTTP 请求头动辄 200~300 字节,而实际数据只有几个字节,头比数据大几十倍 |
| 蜂窝网络计费 | 流量走按流量计费的蜂窝网络,浪费严重 |
| 频繁建连 | 每次上报都要重建 TCP 连接 + TLS 握手,消耗大量资源 |
| 无法服务端主动推送 | 设备通常躲在 NAT 后,没有公网地址;HTTP 只能轮询,绝大多数轮询都是空转 |
1.2 受限设备(Constrained Devices)的四大约束
MQTT 的每一个设计都是在回应以下约束:
| 约束 | 具体表现 | 协议层面的回应 |
|---|
| 算力 | 几块钱单片机,主频几十 MHz,内存几十 KB,跑不动完整 TLS/JSON 解析器 | 报文极小、协议轻量 |
| 电量 | 电池供电,要求撑数月到数年;射频模块开启时间是耗电大头 | 少发、发短、长连接避免频繁握手 |
| 网络 | NB-IoT/2G 带宽仅几十 Kbps,丢包率高、延迟上秒,设备在 NAT 后无公网地址 | 双向通信、小报文、QoS 机制 |
| 规模 | 一个 Broker 可能同时承载几十万到上百万连接 | 极简协议头、高效转发 |
二、核心架构:发布/订阅(Publish/Subscribe)
2.1 与 HTTP 请求/响应模式的对比
| 维度 | HTTP 点对点 | MQTT 发布/订阅 |
|---|
| 通信模式 | 客户端必须知道服务端地址,等待响应 | 所有人只与 Broker 通信 |
| 耦合度 | 点对点强耦合 | 发布者与订阅者完全解耦 |
| 扩展性 | 新增消费者需修改服务端 | 新增订阅方无需修改发布端 |
2.2 解耦特性
- 空间解耦:发布者不知道谁在接收,订阅者不知道是谁发送的。
- 时间解耦:订阅方离线时,Broker 可暂存消息,上线后再投递(取决于 QoS 和会话设置)。
⚠️ 注意:Broker 成为系统单点,生产环境必须做集群(EMQ X、HiveMQ、VerneMQ 均支持)。集群中订阅关系需要在节点间同步,存在额外成本。
三、Topic 设计
3.1 基本规则
- Topic 是用
/ 分层的字符串,例如:factory/line1/dev7/temp
- 无需预先定义:发到哪个 Topic,该 Topic 即存在
- 支持两个通配符:
+:匹配单层(可放在任意层级)
#:匹配该层级及之后所有层级(只能放在最后一层)
3.2 示例
| 订阅 Topic | 能收到的消息 |
|---|
factory/line1/+/temp | 1 号线上所有设备的温度 |
factory/# | 整个工厂的所有消息 |