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

86
我想连接一个客户端,监视代理的所有主题,并在我不知道主题名称时响应事件。
4个回答

132

订阅 # 可以让你订阅除以 $ 开头的主题以外的所有主题(这些通常是控制主题)。

当然,最好先了解你要订阅的内容,并注意某些代理配置可能不允许显式订阅 #


但是以下链接指出,我们不应该订阅 # http://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices。因为它会给代理带来很大的负担,如果主题数量太多的话。 - Vishweshwar Kapse
1
@ralight 有没有办法在RabbitMQ中限制这种行为? - Suraj
2
不要忘记前面的“/”,所以应该是“-t /#”。 - Christian Baumann
5
@ChristianBaumann 的说法是不正确的。使用 # 可以获取所有内容,没有必要以 / 开头,我甚至会建议你不要这样做——这会增加一个不必要的层级。如果你将主题字符串 /one/two//three 分成元素,你会得到 '', one, two, '', three。因此,订阅 /# 将不会接收到发布到 one 的消息,例如。 - ralight
@ralight 我明白你的意思,但是当我执行 mosquitto_sub -d -u username -P password -t # 时,我得到了 Error: -t argument given but no topic specified. 的错误提示。 - Christian Baumann
12
这是因为井号被你的shell解释为一条注释了。尝试使用mosquitto_sub -t '#'或者mosquitto_sub -t \# - ralight

84

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

mosquitto_sub -v -h broker_ip -p 1883 -t '#'

谢谢你!没有人展示这个简单但基础的命令! - Avio

19

具体示例:使用现有的MQTT服务器

mosquitto.org非常活跃(在发布此文时)。这是对MQTT订阅者Linux设备进行良好的烟雾测试:

mosquitto_sub -h test.mosquitto.org -t "#" -v

"

"#" 是通配符,代表所有主题,并返回所有消息(主题):服务器流量很大,所以返回了大量的消息。

如果你的 MQTT 设备将主题发布为 irisys/V4D-19230005/ 到测试 MQTT 代理程序,那么你可以对消息进行过滤:

"
mosquitto_sub -h test.mosquitto.org -t "irisys/V4D-19230005/#" -v

发布一条测试消息到服务器:

mosquitto_pub -h test.mosquitto.org  -m "$NOW,QFNONS,B6,0677,JFKCDG" -t "irisys/V4D-19230005/"

选项:
- -h 主机名(默认MQTT端口=1883) - -t 在主题之前
MQTT匿名服务器设置
在测试这些具体示例或者说服务器不可用后,可以在您自己的Ubuntu设备上快速搭建一个MQTT服务器。
sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt install mosquitto mosquitto-clients

并配置 /etc/mosquitto/mosquitto.conf 以启用匿名发布/订阅

# enable anonymous traffic through port 1833  https://stackoverflow.com/a/41852506/4953146
listener 1883 #https://mosquitto.org/documentation/authentication-methods/
allow_anonymous true

为了测试/概念验证,无需进行身份验证。在您的局域网上验证后,您可以转发1883的广域网流量以进行进一步的测试。


2
你为什么刚才重复了一个已有的答案(由rem提供)? - hardillb
2
@hardillb 很好的问题!Rem的回答很好,但我的例子是“具体的”,因为它指向了一个高流量的MQTT代理,所以读者可以从命令行快速/轻松地进行测试。mqtt.eclipse.org没有常规流量,存在问题。我尝试为社区提供一个简单的工作“具体”示例,并避免我遇到的陷阱/障碍。我认为我的回答是Rem很好的回答的下一个演变(我投票支持Rem的回答)。 - gatorback

2

使用通配符“#”,但要注意,您最终需要以某种方式理解通过总线传递的数据!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接