MQTT: публиковать несколько тем с помощью mosquitto_pub из stdin - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть простая программа gettemp, которая печатает одну температуру каждые 3 секунды ...

$ gettemp -repeat 3
23.5 C
23.2 C
...

Я могу передать это эффективно в инструмент командной строки MQTT mosquitto_pub:

$ gettemp -repeat 3 | mosquitto_pub --stdin-line --topic /sensors/temp/outside

Эффективно Я имею в виду, что новый процесс mosquitto_pub не запускается каждые 3 секунды.

Теперь у меня есть другая программа, которая печатает значения от нескольких датчиков (радиотермометров), всякий раз, когда новые значения получены:

$ temps_radio --format "temp_%n=%v C"
temp_0d=23.5 C
temp_02=11.3 C
temp_04=5.0 C
...

Я бы хотел как-то передать эти данные также в mosquitto_pub, но, конечно, по отдельным темам (например, /sensors/temp/0d).

  • Я бы не хотел бы начинать новый mosquitto_pub для каждой новой строки!

  • Я не знаю, сколько разных датчиков temps_radio будет выплевывать, поэтому я не могу настроить некоторые именованные каналы , позволить нескольким mosquitto_pub считывать с них и распространять вывод temps_radio с использованием некоторых awk в эти трубы.

Действительно ли для этого необходимо написать собственную программу или скрипт?

Я надеялся, что сценарий использования ", передающий поток строк значения ключа в MQTT ", довольно распространен. На другом конце, например, mosquitto_pub поддерживает форматированный пользователем вывод, что делает его удобным для передачи этого в другую программу, такую ​​как

$ mosquitto_sub -t /sensors/temps/# -F "UPDATE Temperatures(%t, %p)" | mysqlcli

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Одно простое решение, которое я могу придумать, - это использовать tail, поскольку вы не хотите заново инициализировать mqtt, вы не можете сделать это с помощью xargs.

Я тестировал это в среде Linux, возможно, есть обходной путьдля окон, поскольку его tty поведение отличается.

поэтому сначала создайте файл, который mosquitto будет слушать как touch temperature.pool, а затем привяжите его к открытому mosquitto_pub tail temperature.pool | mosquitto_pub -l --topic /sensors/temp/outside , что не приведет к уничтожению mosquitto_pub при каждом изменении температуры.pool

, а затем после этого подать ваш исполняемый вывод в файл Temperature.pool, например: temps_radio --format "temp_%n=%v C" >> temperature.pool , он будет публиковать временные выходные данные для каждой строки до ее остановки.отсюда вы можете добавить столько файлов, сколько захотите, в файл пула, и он будет опубликован

0 голосов
/ 12 сентября 2018

Нет, для этого вам нужно написать программу / скрипт.

Такая программа относительно тривиальна в чем-то вроде Python:

import paho.mqtt.client as mqtt
import time
import sys
import re


def main():
  client = mqtt.Client()
  client.connect("localhost", 1883 , 60)
  client.loop_start()

  for line in sys.stdin:
    m = re.match('(.*)=(.*)', line)
    if m:
      client.publish(m.group(1), payload=m.group(2))

  time.sleep(2)
  client.loop_stop()

if __name__ == "__main__":
    main()

Запуск с:

temps_radio --format "temp_%n=%v C" | python publish.py
...