Как получить список всех тем, содержащих определенные значения, известные брокеру MQTT?


Я ищу способ получить список всех тем, известных брокеру. Есть несколько очень похожих вопросов, но они не помогли мне понять это для моего варианта использования.
У меня есть 3 Raspberry Pi с несколькими датчиками (температура, влажность), которые подключены через сеть MQTT. Каждый Pi имеет собственную базу данных, содержащую временные ряды измерений и другие системные переменные (например, ЦП).
Сейчас ищу способ для следующего сценария:

Я хочу контролировать свою систему и обнаруживать аномалии. Для этого я хочу получить все временные ряды датчиков за последние x секунд и обработать их в скрипте Python. Моя система для выполнения расчетов мониторинга может быть любой Pi.

Пример: я использую RPI2 и хочу контролировать всю распределенную сеть. Нет данных о датчиках, подключенных к Pi. Теперь из моего скрипта Python, работающего на RP2, я бы инициализировал клиент 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

Распределенная сеть с брокером и датчиками


person nail    schedule 19.02.2020    source источник


Ответы (1)


Во-первых, ваши шаблоны тем с подстановочными знаками недействительны. Шаблоны тем могут содержать только один символ «#», и он может появляться только в конце темы, например. foo/bar/# подходит, #/foo нет. Вы можете использовать символ +, который является подстановочным знаком одного уровня.

Это означает, что шаблон темы +/sensor/# будет соответствовать каждому из следующего:

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

но нет

  • rpi1/foo/sensor/bar

У брокеров Next нет списка существующих тем. Темы действительно существуют только в тот момент, когда сообщение публикуется для одного из них, затем брокер проверяет шаблоны, которые запрашивают клиенты-подписчики, сверяет эту тему со списком и доставляет ее клиентам, которые соответствуют.

В-третьих, при соединении брокеров в таких циклах вы должны быть очень осторожны с фильтрами мостов, чтобы убедиться, что сообщения не заканчиваются постоянным циклом.

Решение, вероятно, состоит в том, чтобы назначить «главного» брокера и соединить всех остальных одним путем с этим брокером, а затем заставить клиента подписаться либо на «#», чтобы получить все, либо на что-то более похожее на «+/sensor/#», чтобы просто видеть показания датчика.

person hardillb    schedule 19.02.2020
comment
Хорошо, я понял, спасибо! Итак, если я правильно понимаю, я должен подписаться на правильную тему датчика, чтобы получить измерения этого датчика. Но у меня нет возможности получить темы, пока кто-то еще не подпишется на них и не заставит их публиковать свои измерения, не зная точной иерархии тем и сообщения, которое датчик должен начать публиковать свои измерения. Это правильно? - person nail; 20.02.2020
comment
Если вы подпишетесь на #, вы увидите все (при условии отсутствия ACL) опубликованные сообщения. Нет необходимости, чтобы кто-то еще подписывался. - person hardillb; 20.02.2020
comment
Итак, я только что проверил всю настройку, и если я подпишусь на #, я смогу видеть сообщения только в том случае, если запрашиваются показания датчика. Но это означает, что если я использую свою систему как черный ящик, где я хочу иметь возможность подписаться на все темы с помощью #, а затем узнавать о темах, это не может работать таким образом, потому что мне нужен кто-то еще, чтобы вызвать показания датчика и заставить датчик опубликуйте это чтение, чтобы получить измерения из моей подписки. - person nail; 20.02.2020
comment
Если ваши датчики публикуются только по запросу, то это невозможно заставить работать как черный ящик. Единственным обходным решением было бы, если бы датчики, опубликованные с сохраненным флагом, были установлены в true. - person hardillb; 20.02.2020
comment
Хорошо, большое спасибо за ваши усилия! Похоже, мне придется изменить некоторые из моих планов. - person nail; 20.02.2020