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

相关推荐
weixin_41666796几秒前
【无标题】
运维·服务器·网络
我找到地球的支点啦19 分钟前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
予昊22 分钟前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
罗西的思考32 分钟前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
周周记笔记33 分钟前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
浪里镖客1 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
潘潘的嵌入式日记2 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
上海云盾-小余2 小时前
流量攻击复盘:为什么 WAF 完好,业务依旧瘫痪
运维·服务器·网络
戴西软件3 小时前
戴西iDWS.3DViz Suite数据轻量化可视化软件,从传统桌面软件向云端协同的重大突破
大数据·运维·网络·人工智能·机器学习·3d
芯盾时代3 小时前
《金融业网络安全管理办法(征求意见稿)》全条款深度拆解(三)
网络·安全·网络安全