MQTT 通配符 +
和 #
详解
1. 核心定义与作用
单层通配符 +
-
作用:匹配主题路径中 单层任意值,仅占用一个完整层级。
-
规则:
- 必须占据一个完整层级,不能为空。
- 可出现在主题中间位置,但不能跨层级匹配。
-
示例:
订阅主题: sensor/+/temperature 匹配主题: ✅ sensor/device1/temperature ✅ sensor/device2/temperature ❌ sensor/device1/room1/temperature (原因:`+` 仅匹配单层)
多层通配符 #
-
作用:匹配主题路径中 任意层级(包括零层或多层)。
-
规则:
- 必须作为主题的最后一个字符(如
sensor/#
有效,sensor/#/data
无效)。 - 可匹配空层级(如
home/#
匹配home
本身)。
- 必须作为主题的最后一个字符(如
-
示例:
订阅主题: sensor/# 匹配主题: ✅ sensor/temperature ✅ sensor/device1/temperature ✅ sensor/device1/room1/temperature
2. 对比总结
特性 | + | # |
---|---|---|
匹配范围 | 仅匹配单层任意值 | 匹配零或多个层级 |
语法位置 | 可出现在主题中间 | 必须放在主题末尾 |
层级是否可为空 | ❌ 必须存在 | ✅ 可匹配空层级 |
性能影响 | 低 | 高(可能接收大量消息) |
3. 使用场景
+
适用场景
-
动态单层匹配:固定层级结构中替换某一层变量值
示例1: home/+/sensor # 匹配所有房间的传感器(如 `home/kitchen/sensor`) 示例2: /api/v1/+/mqtt/data # 匹配设备ID层(如 `/api/v1/device123/mqtt/data`)
#
适用场景
-
全局监听子主题:监控某前缀下的所有子主题
示例1: home/sensors/# # 匹配所有传感器子主题(如 `home/sensors/light/status`) 示例2: logs/# # 接收所有日志相关主题(如 `logs/error` 或 `logs/system/memory`)
4. 注意事项
- 仅用于订阅:发布消息时禁止使用通配符。
- 系统主题限制:通配符不能匹配以
$
开头的系统主题(如$SYS/...
)。 - 性能优化:避免过度使用
#
,可能导致消息洪泛。 - 边界匹配:
sensor/#
会同时匹配sensor
和sensor/device1
。
5. 总结
通配符 | 核心特点 | 典型用途 |
---|---|---|
+ | 精准匹配单层动态值 | 设备ID、用户ID等单层变量场景 |
# | 全局匹配多级路径 | 监控系统、日志收集等宽泛场景 |