1. MQTT 是什么?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级物联网通信协议。
它的特点是:报文头最小只有 2 字节、资源占用低、适合网络不稳定或带宽有限的场景,因此常用于传感器、智能家居和工业设备。
MQTT 基于 TCP 连接通信,核心模式是:发布/订阅(Publish/Subscribe)。
2. 三个核心角色
发布者 ──发布消息──> Broker ──转发消息──> 订阅者
-
发布者(Publisher):向某个主题发送消息。
-
订阅者(Subscriber):订阅主题并接收消息。
-
Broker:MQTT 服务器,负责客户端连接、主题匹配和消息转发。
发布者不需要知道谁会接收消息,订阅者也不需要知道消息来自哪个设备。一个客户端可以同时发布和订阅。
3. Topic:消息的"地址"
Topic(主题)用于区分消息类型,类似文件路径,使用 / 分层:
home/livingroom/temp
factory/line1/machine1/status
Topic 区分大小写,sensor/temp 与 Sensor/Temp 是两个不同主题。
通配符订阅
| 通配符 | 作用 | 示例 |
|---|---|---|
+ |
匹配一个层级 | home/+/temp 可匹配 home/bedroom/temp |
# |
匹配当前层级及全部子层级,只能放末尾 | home/# 匹配所有以 home/ 开头的主题 |
建议主题按"业务/设备/数据"设计,例如 home/room1/sensor/temperature,层级不要过深。
4. QoS:消息可靠性等级
| QoS | 名称 | 特点 | 适用场景 |
|---|---|---|---|
| 0 | 最多一次 | 不确认,可能丢失,开销最小。 | 心跳、实时温度。 |
| 1 | 至少一次 | 未确认会重发,可能重复。 | 报警、控制指令。 |
| 2 | 恰好一次 | 四次握手,无丢失无重复,开销最大。 | 金融、医疗等极高可靠场景。 |
最终实际 QoS 取发布 QoS 和订阅 QoS 中的较低值。例如发布 QoS 2、订阅 QoS 1,最终按 QoS 1 传输。
5. 一次 MQTT 通信流程
以温湿度传感器向手机发送数据为例:
客户端连接 Broker
↓
手机订阅 home/room1/sensor
↓
传感器发布温湿度数据到该主题
↓
Broker 匹配主题并转发给手机
↓
QoS 1/2 时进行消息确认
连接时,客户端会向 Broker 发送 CONNECT,Broker 用 CONNACK 返回连接结果;订阅使用 SUBSCRIBE/SUBACK;发布使用 PUBLISH。
6. 发布与订阅示例
下面是伪代码,展示典型逻辑,具体函数名以实际 MQTT 客户端库为准:
/* 连接成功后,订阅设备控制主题 */
mqtt_subscribe(client, "home/room1/device/cmd", 1);
/* 发布温湿度数据 */
const char payload[] = "{\"temp\":25.5,\"humidity\":60}";
mqtt_publish(client,
"home/room1/sensor",
payload,
sizeof(payload) - 1,
1,
0);
代码解析: mqtt_subscribe() 订阅控制主题,最后的 1 表示请求 QoS 1。mqtt_publish() 将 JSON 字符串发布到传感器主题;sizeof(payload) - 1 排除字符串结尾的 \0;倒数第二个参数是 QoS 1,最后的 0 表示不设置保留消息。实际项目需要在连接成功回调中订阅主题,并检查每个调用的返回值。
7. 保留消息与遗嘱消息
-
保留消息(Retained Message):Broker 保存某主题最后一条保留消息;新订阅者订阅后可立即收到最新状态。适合设备状态、当前温湿度等。
-
遗嘱消息(Will Message):客户端异常断开时,Broker 自动发布预先设置的消息。适合发布
offline状态,方便平台判断设备是否掉线。
保留消息适合"最后状态",不适合高频日志;遗嘱消息应在连接时配置。
8. 初学者易踩坑
-
主题拼写或大小写不一致,导致订阅不到消息。
-
误把 QoS 1 当作"绝不重复";QoS 1 可能收到重复消息,业务层要能处理幂等。
-
所有数据都用 QoS 2,导致网络和设备开销过大。
-
忽略网络断开与重连后的重新订阅问题。
-
在公网 Broker 上使用弱密码或未使用 TLS,导致消息被窃听或伪造。
-
把敏感信息直接放在 Topic 中,Topic 名通常会暴露给有权限的客户端。
总结
MQTT 的核心可以概括为:
客户端连接 Broker
发布者向 Topic 发布消息
订阅者按 Topic 接收消息
QoS 决定可靠性与开销
它通过 Broker 解耦设备之间的直接连接,非常适合资源有限、网络条件不稳定的物联网系统。