1. MQTT 基础回顾:发布/订阅模型、主题与通配符、QoS等级、会话与遗嘱消息

各位同学,咱们正式开始之前,先把地基夯实。MQTT 的核心概念,说白了就这几块。我见过不少新手,上来就配权限,结果连主题通配符都搞混,最后 Broker 直接崩了。嗯,咱们今天把这几个点彻底理清。

1.1 发布/订阅模型:谁说话,谁听

MQTT 不是传统的客户端到服务器直连。它用的是发布/订阅模型。什么意思?

  • 发布者(Publisher):只管发消息,不关心谁收。
  • 订阅者(Subscriber):只管收消息,不关心谁发。
  • Broker:中间人,负责转发。

我在一个智慧工厂项目里,传感器只负责上报温度,控制台只负责接收告警。两边完全解耦。你想想看,如果哪天要换传感器,订阅者根本不用改代码。这就是发布/订阅的魅力。

核心要点:发布者和订阅者不需要知道对方存在。所有通信都通过 Broker 中转。

1.2 主题(Topic)与通配符:消息的地址

主题就是消息的“地址”。它用斜杠分层,比如 factory/floor1/temperature。订阅者可以精确订阅,也可以用通配符批量订阅。

两种通配符

通配符 含义 示例 匹配结果
+ 单层通配 factory/+/temperature 匹配 factory/floor1/temperature,不匹配 factory/floor1/room1/temperature
# 多层通配 factory/# 匹配 factory/floor1/temperature 和 factory/floor1/room1/humidity

注意:# 只能放在主题末尾,比如 factory/# 合法,factory/#/temp 非法。我曾经见过有人把 # 放中间,结果 Broker 直接报错,排查了半天。

我个人习惯,在设计主题树时,尽量用 + 而不是 #。为什么?因为 # 权限太大,容易泄露不该泄露的数据。后面讲授权策略时,你会深有体会。

1.3 QoS 等级:消息到底可靠不可靠?

QoS(Quality of Service)决定消息的送达保证。MQTT 有三个等级。

QoS 名称 发送次数 适用场景
0 至多一次 1 次(发完即忘) 传感器高频数据,丢一帧无所谓
1 至少一次 至少 1 次(可能重复) 控制指令,必须到达,允许重复
2 恰好一次 4 次握手 支付、计费,不能丢也不能重复

我在做车联网项目时,车辆状态用 QoS 0,因为数据量大,丢几帧不影响。但远程锁车指令必须用 QoS 2,一次都不能错。你想想看,要是锁车指令丢了,后果多严重。

避坑指南:QoS 2 性能开销大,别滥用。我曾经有个同事,把所有消息都设成 QoS 2,结果 Broker 内存爆了。后来改成 QoS 1 + 去重逻辑,问题解决。

1.4 会话与遗嘱消息:连接断了怎么办?

MQTT 的会话分两种:清洁会话和持久会话。

  • 清洁会话(Clean Session = true):断开后,Broker 清空所有会话信息。下次连接重新开始。
  • 持久会话(Clean Session = false):断开后,Broker 保留订阅和离线消息。重连后自动恢复。

遗嘱消息(Will Message)是啥?就是客户端在连接时,告诉 Broker:“如果我挂了,帮我发这条消息。” 比如一个温度传感器突然掉线,Broker 可以自动发布 sensor/status/offline,让监控系统知道。

实战经验:我在智能家居项目里,每个设备连接时都设置遗嘱消息。设备掉线后,Broker 自动更新设备状态。这样控制面板永远显示真实状态,不会出现“设备在线但实际已断”的假象。

1.5 知识体系总览

下面这张图,把今天讲的核心概念串起来。你可以把它当作本章的“地图”。

MQTT 核心概念关系图 MQTT 核心概念关系图 发布者 订阅者 Broker 主题路由 + 权限控制 主题 (Topic) factory/floor1/temp QoS 0 / 1 / 2 至多 / 至少 / 恰好 会话 + 遗嘱 持久 / 清洁 / Will 发布消息 推送消息 💡 说明: 发布者只管发,订阅者只管收。Broker 根据主题路由消息,同时处理 QoS 和会话逻辑。

这张图里,发布者把消息扔给 Broker,Broker 根据主题找到订阅者,再按 QoS 等级推送。同时,会话和遗嘱消息保证连接断开时的行为可控。嗯,这就是 MQTT 的骨架。

1.6 小结

今天咱们把 MQTT 的五个核心概念过了一遍。发布/订阅模型让你解耦,主题和通配符让你灵活订阅,QoS 让你控制可靠性,会话和遗嘱让你处理异常。这些是后面所有授权策略的基础。