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

相关推荐
鶴哥只手遮天13 分钟前
《OpenFOAM 源码深度剖析》系列-第 7 章 网格与拓扑体系:`polyMesh`、`primitiveMesh` 与 patch
算法·开源
曼巴UE514 分钟前
UE 属性同步
网络·c++·ue5
fly_sunnn17 分钟前
STM32-TIM输入捕获
stm32·单片机·嵌入式硬件
创界工坊工作室18 分钟前
25-基于单片机的智能水产养殖控制系统设计
stm32·单片机·嵌入式硬件·proteus
奇树谦21 分钟前
本地FastDDS+远端MQTT转发(多主机数据隔离)架构设计与落地
运维·网络
CHEEVEN_QY21 分钟前
热仿真在液冷板设计中的应用价值与局限性客观评估
人工智能·算法
HackTwoHub24 分钟前
REA逆向一切!渗透逆向新利器、MCP 驱动全栈逆向方案,解析原生二进制、EXE、APK,高效挖掘程序底层漏洞
网络·安全·web安全·网络安全·系统安全
无忧.芙桃28 分钟前
图的精髓:邻接矩阵与遍历全解析
c++·算法·面试·深度优先·广度优先
Nil20830 分钟前
leetcode 1143最长公共子序列
算法·leetcode·职场和发展
脚踏实地,坚持不懈!33 分钟前
Linux 内存回收机制:水位线、kswapd 与 Direct Reclaim
linux·jvm·算法