如何查询mosquitto中已被客户端订阅的MQTT主题?
Mosquitto查询当前已订阅主题列表的实现方法
可以直接查询到mosquitto broker的所有活跃订阅主题,适配不同使用场景的常用方法如下:
方法1:通过$SYS系统主题查询(适合业务逻辑集成)
Mosquitto默认内置了$SYS层级的系统主题,实时记录broker的运行状态:
- 你只需在微控制器或者你的控制客户端上订阅
$SYS/broker/subscriptions/#主题,就能实时获取当前所有存在订阅者的主题列表,返回内容会包含每个主题的订阅客户端数量、QoS等级等信息 - 该主题默认更新间隔为10秒,如果你需要更高的实时性,可以修改mosquitto配置文件中的
sys_interval参数(单位为秒),调整到你需要的更新频率即可。
方法2:终端命令行直接查询(适合调试、手动查询)
如果你可以直接操作运行mosquitto的树莓派终端,执行以下命令即可一次性拉取所有活跃订阅主题:mosquitto_sub -v -t '$SYS/broker/subscriptions/#' -C 1
参数说明:
-v同时输出主题名称和对应消息内容-C 1收到1条返回消息后自动退出,无需持续监听
方法3:动态安全插件查询(适合大量客户端的生产场景)
如果你后续要接入大量动态订阅的客户端,需要更稳定的程序化查询能力,可以开启mosquitto的动态安全插件:
- 编辑mosquitto配置文件,添加如下配置启用插件:
plugin /usr/lib/mosquitto_dynamic_security.so plugin_opt_config_file /var/lib/mosquitto/dynamic-security.json
- 重启mosquitto服务后,你可以直接调用插件的控制指令获取结构化的订阅列表,不需要额外解析
$SYS主题的返回内容,更适合嵌入到自动化业务逻辑中。
注意:如果你的mosquitto开启了ACL访问控制,需要先给用于查询的客户端开放
$SYS主题或动态安全插件的访问权限,否则会查询失败。
你拿到活跃订阅列表后,仅向列表内存在的主题发布消息,即可完全避免无意义的流量消耗,完美匹配你的使用需求。
内容的提问来源于stack exchange,提问作者kubiej21
相关产品推荐
相关产品推荐

