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

相关推荐
倒头就睡的小比特13 小时前
算法竞赛C++常用的STL
c++·算法
不悔哥14 小时前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
小羊没烦恼!14 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
XiHongShi201614 小时前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
虎头金猫14 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
猎头南楼15 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
深圳老胡16 小时前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光16 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark16 小时前
大规模并行计算中的负载均衡算法研究4
算法
wuyk55516 小时前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网