我正在寻找一种获取经纪人已知的所有主题的列表的方法。有一些非常相似的问题,但是它们并没有帮助我为我的用例解决。我有3个带有多个传感器(温度,湿度)的Raspberry Pi,它们通过MQTT网络连接。每个Pi都有自己的数据库,其中包含测量的时间序列和其他系统变量(例如CPU)。现在,我正在寻找以下szenario的方法:
我想监视我的系统并检测异常。为此,我想在最近的x秒内获取所有传感器时间序列,并在python脚本中进行处理。我的系统可以做每个Pi的监视计算。示例:我在RPI2上,想监视整个分布式网络。没有关于Pi上安装的传感器的已知知识。现在,从运行在RP2上的python脚本中,我将启动一个MQTT客户端,并在代理上订阅每个传感器数据。我知道通配符#,但不确定这种情况下如何使用通配符。我的魔术命令看起来像下面的伪代码:
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/sensor/foo
rpi1/sensor/bar/temp
但不是
rpi1/foo/sensor/bar
下一个经纪人没有列出的主题。主题仅在消息发布给客户的那一刻才真正存在,然后代理检查订阅客户请求的模式,并对照列表检查该主题并将其传递给匹配的客户。
第三,在像这样的循环中桥接代理时,您必须非常小心桥接过滤器,以确保消息不会以恒定的循环结束。
解决方案可能是指定一个“主”经纪人,并将所有其他经纪人桥接到该经纪人,然后让客户端订阅“#”以获取所有内容,或者更像是“ + / sensor /#”请参阅传感器读数。