Skip to content

MQTT 自动订阅

什么是 MQTT 自动订阅?

自动订阅是 RobustMQ 支持的 MQTT 扩展功能。自动订阅允许您为 RobustMQ 配置多个规则,设备成功连接后将按照规则自动订阅指定主题,无需额外的订阅请求。

自动订阅使客户端在连接时自动订阅到配置的主题,消除了手动订阅请求的需要,简化了客户端实现。

何时使用 MQTT 自动订阅?

自动订阅在以下场景中特别有用:

  • 简化客户端实现:客户端无需处理订阅逻辑,减少代码复杂度
  • 一致的主题访问:确保所有连接的客户端自动拥有特定主题的访问权限
  • 设备管理:设备连接时自动订阅状态或控制主题
  • 系统集成:将新设备无缝集成到现有主题结构中
  • 减少网络流量:消除单独订阅请求的需要

自动订阅的特性

  • 自动订阅:客户端连接时自动订阅到配置的主题
  • 动态主题构建:支持占位符根据客户端信息创建动态主题
  • 可配置参数:设置 QoS 级别、保留标志和其他订阅参数
  • 多规则支持:为不同场景配置多个自动订阅规则
  • 客户端特定主题:使用占位符为每个客户端创建唯一主题

自动订阅配置

自动订阅支持以下配置参数:

  • 主题:自动订阅的主题模式(支持占位符)
  • QoS:服务质量级别(0、1 或 2)
  • No Local:是否排除同一客户端发布的消息
  • Retain As Published:是否保留此订阅发布的消息
  • Retain Handling:如何处理保留消息(0、1 或 2)

占位符

自动订阅支持占位符来动态构建主题。占位符格式为 ${}。支持的变量包括:

  • ${clientid}:客户端 ID
  • ${username}:客户端用户名
  • ${host}:客户端连接的 IP 地址

例如,当客户端 ID 为 device001,配置的主题为 sensor/${clientid}/data 时,客户端连接后将自动订阅主题 sensor/device001/data

通过 MQTTX 使用自动订阅

使用 MQTTX CLI

  1. 连接并应用自动订阅

    bash
    # 使用客户端 ID 连接(将根据配置的规则应用自动订阅)
    mqttx conn -i device001 -h '117.72.92.117' -p 1883
  2. 发布到自动订阅的主题

    bash
    # 发布到客户端自动订阅的主题
    mqttx pub -t 'sensor/device001/data' -m '{"temperature":25.5,"humidity":60}' -h '117.72.92.117' -p 1883
  3. 验证自动订阅

    bash
    # 连接另一个客户端来验证自动订阅
    mqttx conn -i device002 -h '117.72.92.117' -p 1883
    # 此客户端将自动接收发布到其自动订阅主题的消息

实际应用示例

设备状态监控

bash
# 设备连接并自动订阅状态主题
mqttx conn -i sensor001 -h '117.72.92.117' -p 1883

# 系统发布状态请求到设备特定主题
mqttx pub -t 'device/sensor001/status/request' -m '{"action":"get_status"}' -h '117.72.92.117' -p 1883

# 设备自动接收请求并可以响应
mqttx pub -t 'device/sensor001/status/response' -m '{"status":"online","battery":85}' -h '117.72.92.117' -p 1883

智能家居设备控制

bash
# 智能灯连接并自动订阅控制主题
mqttx conn -i light001 -h '117.72.92.117' -p 1883

# 家庭自动化系统发送控制命令
mqttx pub -t 'home/light001/control' -m '{"action":"turn_on","brightness":80,"color":"white"}' -h '117.72.92.117' -p 1883

# 灯自动接收并处理命令

工业设备管理

bash
# 机器连接并自动订阅命令主题
mqttx conn -i machine001 -h '117.72.92.117' -p 1883

# 控制系统发送操作命令
mqttx pub -t 'factory/machine001/command' -m '{"operation":"start","speed":1000,"mode":"production"}' -h '117.72.92.117' -p 1883

# 机器自动接收并执行命令

车队管理系统

bash
# 车辆连接并自动订阅调度主题
mqttx conn -i vehicle001 -h '117.72.92.117' -p 1883

# 调度中心发送路线分配
mqttx pub -t 'fleet/vehicle001/dispatch' -m '{"route":"Route_A","pickup":"Location_1","delivery":"Location_2"}' -h '117.72.92.117' -p 1883

# 车辆自动接收调度信息

IoT 传感器网络

bash
# 多个传感器使用不同的客户端 ID 连接
mqttx conn -i temp_sensor_001 -h '117.72.92.117' -p 1883
mqttx conn -i humidity_sensor_001 -h '117.72.92.117' -p 1883
mqttx conn -i pressure_sensor_001 -h '117.72.92.117' -p 1883

# 数据收集系统向每个传感器发送配置
mqttx pub -t 'sensor/temp_sensor_001/config' -m '{"interval":30,"threshold":25}' -h '117.72.92.117' -p 1883
mqttx pub -t 'sensor/humidity_sensor_001/config' -m '{"interval":60,"threshold":70}' -h '117.72.92.117' -p 1883
mqttx pub -t 'sensor/pressure_sensor_001/config' -m '{"interval":45,"threshold":1013}' -h '117.72.92.117' -p 1883

自动订阅与手动订阅的区别

特性自动订阅手动订阅
设置在服务端配置客户端必须发送 SUBSCRIBE 包
复杂度简单的客户端实现客户端需要订阅逻辑
灵活性服务端控制客户端控制
网络流量减少(无需 SUBSCRIBE 包)需要额外的 SUBSCRIBE 包
动态主题通过占位符支持客户端必须构建主题
错误处理服务端管理订阅客户端必须处理订阅错误

最佳实践

  1. 主题设计:使用有意义的主题模式,配合占位符创建动态主题
  2. QoS 选择:根据消息重要性选择合适的 QoS 级别
  3. 客户端 ID 策略:使用一致的客户端 ID 命名约定,确保可预测的主题构建
  4. 资源管理:监控自动订阅使用情况,避免资源耗尽
  5. 安全性:确保自动订阅主题的适当认证和授权
  6. 测试:使用各种客户端场景测试自动订阅规则

配置示例

基本自动订阅

text
主题: sensor/data
QoS: 1
描述: 所有客户端自动订阅传感器数据主题

客户端特定自动订阅

text
主题: device/${clientid}/commands
QoS: 2
描述: 每个客户端自动订阅自己的命令主题

基于用户的自动订阅

text
主题: user/${username}/notifications
QoS: 1
描述: 客户端自动订阅用户特定的通知主题

基于主机的自动订阅

text
主题: location/${host}/status
QoS: 0
描述: 客户端自动订阅位置特定的状态主题

注意事项

  1. 主题格式:使用正确的占位符语法 ${variable} 创建动态主题
  2. 客户端 ID:确保客户端 ID 唯一并遵循命名约定
  3. QoS 级别:根据消息传递要求选择合适的 QoS 级别
  4. 资源限制:监控自动订阅数量,防止资源耗尽
  5. 安全性:为自动订阅主题实施适当的访问控制
  6. 测试:在生产环境部署前彻底测试自动订阅规则