MQTT:使用stdin中的mosquitto_pub发布多个主题

时间:2018-09-11 20:20:19

标签: mqtt mosquitto

我有一个简单的程序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

通过有效,我的意思是,每3秒就没有新的mosquitto_pub进程开始。

现在我有另一个程序,每当接收到新值时,该程序就会从多个传感器(无线电温度计)打印值:

$ 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_radioawk的输出分布到这些管道中。

真的有必要为此编写自己的程序或脚本吗?

我希望用例“ 将键值行输入到MQTT ”是一种很常见的情况。 例如,在另一端,mosquitto_pub支持用户格式化的输出,这使得将其通过管道传输到另一个程序(如

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

2 个答案:

答案 0 :(得分:2)

我可以想到的一个简单解决方案是使用tail,因为您不想重新启动mqtt,因此无法使用xargs来实现。

我在linux env上对此进行了测试,也许它的tty行为有所不同,因此Windows可能有一种解决方法。

因此,首先创建一个文件,mosquitto将像touch temperature.pool一样听 然后将其绑定到打开的mosquitto_pub tail temperature.pool | mosquitto_pub -l --topic /sensors/temp/outside 这不会因为温度的每次变化而杀死mosquitto_pub。

然后将可执行文件的输出馈送到temperature.pool 喜欢: temps_radio --format "temp_%n=%v C" >> temperature.pool 这将为每行发布get temp输出,直到停止为止。 从这里可以向池文件中添加任意数量的可执行文件,它将被发布

答案 1 :(得分:0)

否,您必须编写一个程序/脚本来完成此操作。

在像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