RTT-MQTT

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/tempSensor/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 解耦设备之间的直接连接,非常适合资源有限、网络条件不稳定的物联网系统。

相关推荐
vivo互联网技术1 小时前
MagicBokeh:单步统一生成式框架实现真实感长焦虚化渲染 | CVPR 2026 Oral
人工智能·算法
千视kiloview1 小时前
“轻”不等于降级:IP时代广播制作系统的轻量化与Hybrid架构实践
网络·tcp/ip·架构
国科安芯1 小时前
星上能源管家:AS32S601辐射加固MCU在卫星电源管理中的性能解析
单片机·嵌入式硬件·能源·抗辐射加固
不爱土豆唯爱马铃薯1 小时前
升级 AiPy Pro 2.0 后,我把安全中心这几项挨个打开了数据安全、沙盒权限、工作空间隔离——这些 2.0 新功能对科研协作场景的实际影响
网络·安全·php
茯苓gao1 小时前
无感FOC核心原理:没有编码器,电机如何获得转子电角度?
笔记·嵌入式硬件·学习
lucas_AI2 小时前
Grok 4.6:追平 GPT-5.6 Sol 的半价旗舰,但别只看跑分
人工智能·算法
南京码讯光电技术有限公司2 小时前
What Does Ex tb IIIC T80°C Db Mean?
服务器·网络·数据库
zephyr052 小时前
链表实现O(n log n)时间复杂度的排序——归并排序详解
java·数据结构·算法
小绫网络安全2 小时前
【每日一讲】Pikachu漏洞练习靶场
网络·web安全·网络安全·靶场·pikachu