主题与通配符
2026/1/15大约 4 分钟
主题与通配符
主题(Topic)是 MQTT 消息路由的核心,理解主题的设计和通配符的使用对于构建高效的 MQTT 应用至关重要。
主题基础
主题格式
MQTT 主题是一个 UTF-8 编码的字符串,使用斜杠 / 分隔层级:
home/living-room/temperature
sensor/device001/status
china/beijing/weather主题规则
- 区分大小写:
Home/Temperature和home/temperature是不同的主题 - 允许空格:主题中可以包含空格(但不推荐)
- 以
/开头:/home/temp是合法的,第一层为空字符串 - 不能为空:主题字符串不能为空
- 不能包含
#和+:这两个字符是通配符,只能用于订阅
主题层级
主题: home/living-room/temperature
| | |
| | +-- 第三层: temperature
| +-------------- 第二层: living-room
+------------------- 第一层: home通配符
MQTT 提供两种通配符,仅用于订阅,不能用于发布。
单层通配符 +
+ 匹配主题的单个层级:
订阅: home/+/temperature
匹配:
✓ home/living-room/temperature
✓ home/bedroom/temperature
✓ home/kitchen/temperature
不匹配:
✗ home/temperature (缺少一层)
✗ home/floor1/bedroom/temperature (多了一层)多个 + 可以组合使用:
订阅: +/+/temperature
匹配:
✓ home/bedroom/temperature
✓ office/room1/temperature
✓ factory/zone1/temperature多层通配符 #
# 匹配主题的多个层级,必须放在主题的最后:
订阅: home/#
匹配:
✓ home
✓ home/living-room
✓ home/living-room/temperature
✓ home/bedroom/humidity
✓ home/floor1/room1/device1/status订阅: sensor/+/#
匹配:
✓ sensor/device1/status
✓ sensor/device1/temperature/value
✓ sensor/device2/humidity/current通配符使用规则
| 规则 | 示例 | 说明 |
|---|---|---|
# 必须在最后 | home/# ✓ | 正确 |
# 不能在中间 | home/#/temp ✗ | 错误 |
+ 可以在任意位置 | +/room/+ ✓ | 正确 |
| 通配符只能订阅 | 发布到 home/+ ✗ | 错误 |
系统主题
MQTT Broker 通常会发布系统状态到以 $ 开头的主题:
$SYS/broker/version # Broker 版本
$SYS/broker/uptime # 运行时间
$SYS/broker/clients/total # 客户端总数
$SYS/broker/messages/sent # 发送消息数注意
订阅 # 不会匹配 $ 开头的系统主题,需要显式订阅 $SYS/#。
主题设计最佳实践
1. 层级结构设计
推荐的主题层级结构:
{组织}/{位置}/{设备类型}/{设备ID}/{数据类型}
示例:
company/factory1/sensor/temp001/temperature
company/factory1/sensor/temp001/humidity
company/factory1/actuator/valve001/status2. 命名规范
推荐:
✓ home/living-room/temperature (小写,连字符分隔)
✓ sensor/device_001/status (下划线分隔)
不推荐:
✗ Home/LivingRoom/Temperature (大小写混用)
✗ home/living room/temperature (包含空格)
✗ /home/temperature (以斜杠开头)3. 避免过深层级
推荐(3-5层):
✓ home/bedroom/light/status
不推荐(层级过深):
✗ company/region/city/building/floor/room/device/sensor/type/value4. 使用有意义的名称
推荐:
✓ device/sensor001/temperature
✓ home/bedroom/light/brightness
不推荐:
✗ d/s001/t
✗ a/b/c/d主题设计示例
智能家居
# 设备状态
home/{room}/{device}/status
home/living-room/light/status
home/bedroom/ac/status
# 设备控制
home/{room}/{device}/set
home/living-room/light/set
home/bedroom/ac/set
# 传感器数据
home/{room}/sensor/{type}
home/living-room/sensor/temperature
home/living-room/sensor/humidity物联网平台
# 设备上行数据
iot/{product_id}/{device_id}/telemetry
iot/{product_id}/{device_id}/event
iot/{product_id}/{device_id}/property/post
# 设备下行指令
iot/{product_id}/{device_id}/command
iot/{product_id}/{device_id}/property/set
# 设备状态
iot/{product_id}/{device_id}/status车联网
# 车辆数据上报
vehicle/{vin}/telemetry/location
vehicle/{vin}/telemetry/speed
vehicle/{vin}/telemetry/fuel
# 远程控制
vehicle/{vin}/command/lock
vehicle/{vin}/command/ac
# OTA 升级
vehicle/{vin}/ota/notify
vehicle/{vin}/ota/progress主题过滤性能
订阅数量影响
场景: 1000 个设备,每个设备 10 个数据点
方案1: 每个数据点单独订阅
订阅数: 1000 × 10 = 10000 个订阅
方案2: 使用通配符
订阅: device/+/#
订阅数: 1 个订阅通配符性能考虑
# 精确订阅(性能最好)
device/sensor001/temperature
# 单层通配符(性能较好)
device/+/temperature
# 多层通配符(性能一般)
device/#
# 全局订阅(性能最差,谨慎使用)
#共享订阅(MQTT 5.0)
MQTT 5.0 引入共享订阅,实现消费者负载均衡:
# 共享订阅格式
$share/{group}/{topic}
# 示例
$share/consumer-group/sensor/+/temperature +-- Consumer 1 (收到消息1, 4, 7...)
|
Broker --消息--> $share/group/topic --+-- Consumer 2 (收到消息2, 5, 8...)
|
+-- Consumer 3 (收到消息3, 6, 9...)# Python 共享订阅示例
client.subscribe("$share/mygroup/sensor/+/temperature")面试题预览
常见面试题
- MQTT 主题通配符
+和#有什么区别? - 为什么订阅
#不能匹配$SYS开头的主题? - 如何设计一个物联网平台的主题结构?
- MQTT 5.0 的共享订阅有什么作用?
小结
主题是 MQTT 消息路由的核心,合理的主题设计能够提高系统的可维护性和性能。使用通配符可以简化订阅管理,但要注意性能影响。MQTT 5.0 的共享订阅为消费者负载均衡提供了原生支持。
