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

How to get a list of all topics containing specific values known to MQTT broker?


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

我想监控我的系统并检测异常。为此,我想获取最后 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

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

第三,当在这样的循环中桥接代理时,您必须非常小心地使用桥接过滤器,以确保消息不会以持续不断的循环结束。

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