如何获取包含MQTT broker已知的特定值的所有主题的列表?

如何获取包含MQTT broker已知的特定值的所有主题的列表?,mqtt,wildcard,distributed-system,paho,Mqtt,Wildcard,Distributed System,Paho,我正在寻找一种方法来获得一个经纪人知道的所有主题的列表。有一些非常类似的问题,但它们并没有帮助我为我的用例找出答案 我有3个树莓Pi,带有多个传感器(温度、湿度),通过MQTT网络连接。每个Pi都有自己的数据库,其中包含测量时间序列和其他系统变量(如CPU) 现在,我正在为以下szenario寻找一种方法: 我想监控我的系统并检测异常情况。为此,我希望在最后x秒内获得所有传感器时间序列,并在python脚本中处理它们。我的系统做的监控计算可以是每一个Pi 示例:我在RPI2上,希望监视整个分布式


我正在寻找一种方法来获得一个经纪人知道的所有主题的列表。有一些非常类似的问题,但它们并没有帮助我为我的用例找出答案
我有3个树莓Pi,带有多个传感器(温度、湿度),通过MQTT网络连接。每个Pi都有自己的数据库,其中包含测量时间序列和其他系统变量(如CPU)
现在,我正在为以下szenario寻找一种方法:

我想监控我的系统并检测异常情况。为此,我希望在最后x秒内获得所有传感器时间序列,并在python脚本中处理它们。我的系统做的监控计算可以是每一个Pi

示例:我在RPI2上,希望监视整个分布式网络。没有关于连接到Pi的传感器的已知信息。现在,通过在RP2上运行的python脚本,我将初始化MQTT客户机并订阅代理上的每个传感器数据<我知道通配符,但我不知道在那种情况下如何使用它。我的magic命令看起来像以下伪代码:

1) client subscribe to all sensor data - #/sensor/#
2) get list with all topics 
3) client subscribe to all topics from given list list/#
4) analyse data for anomalies every x seconds

首先,您的通配符主题模式无效。主题模式只能包含一个“#”字符,并且只能出现在主题的末尾,例如,
foo/bar/
有效,
/foo
无效。您可以使用
+
字符,它是一个单级通配符

这意味着
+/sensor/#
的主题模式将与以下各项匹配:

  • rpi1/传感器/foo
  • rpi1/传感器/棒/温度
但不是

  • rpi1/foo/sensor/bar
下一个代理没有存在的主题列表。主题只有在消息发布到某个客户端的瞬间才真正存在,代理然后检查订阅客户端请求的模式,并对照列表检查该主题,然后将其交付给匹配的客户端

第三,在这样的循环中桥接代理时,必须非常小心桥接过滤器,以确保消息不会以恒定循环结束


解决方案可能是指定一个“主”代理,将所有其他代理以一种方式连接到该代理,然后让客户订阅“#”以获取所有内容,或者订阅更像“+/sensor/#”的内容以查看传感器读数。

好的,我理解,谢谢!因此,如果我理解正确,我必须订阅正确的传感器主题,以获得该传感器的测量值。但是如果没有其他人订阅并让他们发布他们的测量值,而不知道传感器开始发布其测量值所需的确切主题层次结构和消息,我就没有机会获得这些主题。是这样吗?如果您订阅
#
,那么您将看到发布的所有消息(假设没有ACL)。其他人不需要订阅。所以我只是测试了整个设置,如果订阅
#
,我只能在请求传感器读取时看到消息。但这意味着,如果我将我的系统用作黑盒,我希望能够通过
#
订阅所有主题,然后发现主题无法通过这种方式工作,因为我需要其他人触发传感器读数,并使传感器发布该读数,以从我的订阅中获取测量值。如果您的传感器仅按要求发布,那么就没有办法让它成为一个黑匣子。唯一的解决办法是,如果发布的传感器保留标志设置为trueOk,非常感谢您的努力!看来我得改变一些计划了。