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

问题描述 投票:0回答:1

我正在寻找一种获取经纪人已知的所有主题的列表的方法。有一些非常相似的问题,但是它们并没有帮助我为我的用例解决。我有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

Distributed Network with broker and sensors

mqtt wildcard distributed-system paho
1个回答
0
投票

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

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

  • rpi1/sensor/foo
  • rpi1/sensor/bar/temp

但不是

  • rpi1/foo/sensor/bar

下一个经纪人没有列出的主题。主题仅在消息发布给客户的那一刻才真正存在,然后代理检查订阅客户请求的模式,并对照列表检查该主题并将其传递给匹配的客户。

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

解决方案可能是指定一个“主”经纪人,并将所有其他经纪人桥接到该经纪人,然后让客户端订阅“#”以获取所有内容,或者更像是“ + / sensor /#”请参阅传感器读数。

© www.soinside.com 2019 - 2024. All rights reserved.