乐闻世界logo
搜索文章和话题

MQTT 的主题通配符有哪些?如何使用?

2月21日 15:45

MQTT 的主题通配符是一种强大的订阅机制,允许客户端订阅一类主题而不是单个主题,提高了订阅的灵活性。

主题通配符类型

MQTT 提供两种通配符:

1. 单级通配符(+)

  • 符号:加号(+)
  • 作用:匹配主题中的单个层级
  • 位置:可以出现在主题的任何位置
  • 限制:不能匹配空层级

2. 多级通配符(#)

  • 符号:井号(#)
  • 作用:匹配主题中的多个层级(包括零个)
  • 位置:必须出现在主题的最后
  • 限制:必须是主题过滤器的最后一个字符

通配符使用示例

单级通配符(+)示例

shell
订阅主题:home/+/temperature 匹配的主题: - home/livingroom/temperature ✓ - home/bedroom/temperature ✓ - home/kitchen/temperature ✓ 不匹配的主题: - home/livingroom/kitchen/temperature ✗(层级过多) - home/temperature ✗(层级过少) - home/livingroom/humidity ✗(最后一层不匹配)
shell
订阅主题:sensor/+/data/+ 匹配的主题: - sensor/001/data/temperature ✓ - sensor/002/data/humidity ✓ - sensor/003/data/pressure ✓ 不匹配的主题: - sensor/001/data ✗(层级过少) - sensor/001/data/temperature/value ✗(层级过多)

多级通配符(#)示例

shell
订阅主题:home/# 匹配的主题: - home/ ✓ - home/livingroom ✓ - home/livingroom/temperature ✓ - home/livingroom/temperature/value ✓ - home/bedroom/humidity ✓ 不匹配的主题: - home ✗(必须以 / 结尾或包含 /) - office/livingroom ✗(第一层不匹配)
shell
订阅主题:sensor/+/# 匹配的主题: - sensor/001/ ✓ - sensor/001/data ✓ - sensor/001/data/temperature ✓ - sensor/002/data/humidity/value ✓ 不匹配的主题: - sensor ✗(层级过少) - office/001/data ✗(第一层不匹配)

组合使用示例

shell
订阅主题:home/+/sensors/# 匹配的主题: - home/livingroom/sensors/ ✓ - home/livingroom/sensors/temperature ✓ - home/livingroom/sensors/temperature/value ✓ - home/bedroom/sensors/humidity ✓ 不匹配的主题: - home/sensors/ ✗(缺少中间层级) - home/livingroom/sensors ✗(# 必须在最后)

通配符规则

单级通配符(+)规则

  1. 匹配单个层级:只能匹配一个非空层级
  2. 可以多次使用:可以在主题过滤器中多次出现
  3. 可以出现在任何位置:可以在主题的任何层级使用
  4. 不能跨层级:不能匹配多个层级

多级通配符(#)规则

  1. 匹配多个层级:可以匹配零个或多个层级
  2. 必须在最后:必须是主题过滤器的最后一个字符
  3. 只能使用一次:每个主题过滤器中只能使用一次
  4. 必须跟随 /:如果主题有多个层级,# 前面必须有 /

通配符应用场景

1. 设备分类监控

shell
场景:监控所有温度传感器 订阅主题:sensors/+/temperature 效果:接收所有设备的温度数据

2. 区域监控

shell
场景:监控某个区域的所有数据 订阅主题:building/floor1/# 效果:接收一楼所有设备的数据

3. 设备状态监控

shell
场景:监控所有设备的在线状态 订阅主题:device/+/status 效果:接收所有设备的状态更新

4. 数据类型订阅

shell
场景:订阅所有告警消息 订阅主题:alert/# 效果:接收所有类型的告警

5. 分层订阅

shell
场景:订阅特定类型的所有子主题 订阅主题:system/metrics/+/# 效果:接收所有系统指标的详细数据

通配符限制和注意事项

1. 发布限制

  • 不能发布到通配符主题:通配符只能用于订阅,不能用于发布
  • 主题必须明确:发布时必须指定完整的主题路径

2. 订阅限制

  • 通配符不能用于主题层级内部:如 home/room+/temperature 是无效的
  • # 必须在最后home/#/temperature 是无效的
  • + 不能匹配空home/+/temperature 不能匹配 home//temperature

3. 性能考虑

  • 通配符订阅会增加 Broker 负担:Broker 需要进行主题匹配
  • 避免过度使用通配符:过多的通配符订阅可能影响性能
  • 合理设计主题结构:良好的主题设计可以减少通配符使用

4. 安全考虑

  • ACL 权限控制:通配符订阅需要相应的权限
  • 避免过度授权:通配符订阅可能暴露过多数据
  • 最小权限原则:只授予必要的通配符权限

代码示例

Python (paho-mqtt)

python
import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") # 单级通配符订阅 client.subscribe("sensor/+/temperature") # 多级通配符订阅 client.subscribe("home/bedroom/#") # 组合通配符订阅 client.subscribe("system/+/metrics/#") def on_message(client, userdata, msg): print(f"Received: {msg.topic} - {msg.payload.decode()}") client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("broker.example.com", 1883, 60) client.loop_forever()

JavaScript (MQTT.js)

javascript
const mqtt = require('mqtt'); const client = mqtt.connect('mqtt://broker.example.com'); client.on('connect', () => { console.log('Connected'); // 单级通配符订阅 client.subscribe('sensor/+/temperature'); // 多级通配符订阅 client.subscribe('home/bedroom/#'); // 组合通配符订阅 client.subscribe('system/+/metrics/#'); }); client.on('message', (topic, message) => { console.log(`Received: ${topic} - ${message.toString()}`); });

最佳实践

1. 主题设计

  • 层级清晰:主题层级应该清晰、有意义
  • 避免过深:主题层级不宜过深(建议不超过 5 层)
  • 使用分隔符:统一使用 / 作为分隔符
  • 命名规范:使用一致的命名规范

2. 通配符使用

  • 按需使用:只在需要时使用通配符
  • 避免过度通配:避免使用过于宽泛的通配符(如 #)
  • 组合使用:合理组合单级和多级通配符
  • 性能优化:在高性能场景下减少通配符使用

3. 订阅管理

  • 及时取消订阅:不再需要的订阅应该及时取消
  • 避免重复订阅:避免重复订阅相同的主题
  • 监控订阅数量:监控订阅数量,避免过多订阅

4. 安全管理

  • 权限控制:为通配符订阅设置适当的权限
  • 最小权限:只授予必要的最小权限
  • 定期审查:定期审查通配符订阅权限

通配符性能优化

1. Broker 优化

  • 选择合适的 Broker:选择支持高效通配符匹配的 Broker
  • 配置优化:根据实际需求调整 Broker 配置
  • 集群部署:大规模场景下使用集群部署

2. 订阅优化

  • 精确订阅优先:优先使用精确主题订阅
  • 减少通配符层级:减少通配符匹配的层级
  • 批量订阅:使用批量订阅减少连接开销

3. 主题优化

  • 主题前缀:使用主题前缀减少匹配范围
  • 主题分组:合理分组主题,减少通配符使用
  • 避免通配符嵌套:避免复杂的通配符嵌套

MQTT 主题通配符是提高订阅灵活性的重要机制,合理使用可以简化应用逻辑,提高开发效率。但需要注意性能和安全问题,避免过度使用通配符。

标签:MQTT