如何订阅MQTT代理的所有主题

Yug*_*ari 39 mqtt mosquitto

我想连接一个客户端,该客户端将监视代理的所有主题,以便在我不知道主题的名称时响应事件.

ral*_*ght 61

订阅#允许您订阅除了以a开头的主题之外的所有内容$(这些通常都是控制主题).

当然,最好先了解您订阅的内容,并注意某些代理配置可能会禁止#明确订阅.

  • @ChristianBaumann这是不正确的。`#`可以为您提供一切。无需以`/`开头,我会积极鼓励您不要这样做-它增加了不必要的层次结构。如果将主题字符串`/ one / two // three`拆分为元素,则会得到``,`one`,`two`,``,`three`。因此,例如,订阅`/#`将不会收到发布到`one`的消息。 (3认同)
  • 那是因为您的shell吞下了#作为注释。尝试`mosquitto_sub -t'#'`或`mosquitto_sub -t \#` (3认同)
  • 不要忘记前导“/”,所以它应该是“-t /#” (2认同)

rem*_*rem 45

您可以使用mosquitto_sub(这是mosquitto-clients包的一部分)并订阅通配符主题#:

mosquitto_sub -v -h broker_ip -p 1883 -t '#'
Run Code Online (Sandbox Code Playgroud)


gat*_*ack 8

具体例子

mosquitto.org 非常活跃(在发布时)。这是 MQTT 订阅者 linux 设备的一个很好的冒烟测试:

mosquitto_sub -h test.mosquitto.org -t "#" -v
Run Code Online (Sandbox Code Playgroud)

“#”是主题的通配符并返回所有消息(主题):服务器有大量流量,因此它返回了消息的“消防水管”。

如果您的 MQTT 设备将 的主题发布irisys/V4D-19230005/到测试 MQTT broker ,那么您可以过滤消息:

mosquitto_sub -h test.mosquitto.org -t "irisys/V4D-19230005/#" -v
Run Code Online (Sandbox Code Playgroud)

选项:

  • -h 主机名(默认 MQTT 端口 = 1883)
  • -t 在主题之前

  • 为什么你只是重复现有的答案(由 rem 提供)? (2认同)
  • @hardillb 好问题!Rem 有一个很好的答案,但是,我的示例是“具体”的,因为它指向高流量 MQTT 代理,因此读者可以快速/轻松地从命令行进行测试。mqtt.eclipse.org 没有正常流量并且存在问题。我试图为社区提供一个简单的工作“具体”示例,并避免我遇到的陷阱/障碍。我觉得我的答案是雷姆的好答案的下一个演变(我赞成雷姆的答案) (2认同)