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

MQTT:使用stdin中的mosquitto_pub发布多个主题,mqtt,mosquitto,Mqtt,Mosquitto,我有一个简单的程序gettemp,它每3秒打印一个温度 $ gettemp -repeat 3 23.5 C 23.2 C ... 我可以将其高效地导入MQTT命令行工具: 我的意思是,没有新的mosquitto_pub流程每3秒启动一次 现在我有了另一个程序,每当接收到新值时,就会打印来自多个传感器(无线电温度计)的值: $ temps_radio --format "temp_%n=%v C" temp_0d=23.5 C temp_02=11.3 C temp_04=

我有一个简单的程序
gettemp
,它每3秒打印一个温度

$ gettemp -repeat 3
23.5 C
23.2 C
...
我可以将其高效地导入MQTT命令行工具:

我的意思是,没有新的
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

  • 我不知道会吐出多少不同的传感器,因此我无法设置一些命名管道,让多个
    mosquito\u pub
    从中读取,并使用一些
    awk
    temps\u radio
    输出分配到这些管道中

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

我希望用例“将键值行流馈送到MQTT”是一种非常常见的方法。 例如,在另一端,这使它很好地通过管道传输到另一个程序中,如

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

不,您必须编写程序/脚本才能执行此操作

这样的程序在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

不,您必须编写程序/脚本才能执行此操作

这样的程序在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

我能想到的一个简单解决方案是使用tail,因为您不想重新初始化mqtt,所以不能使用xargs

我在LinuxEnv中对此进行了测试,因为windows的tty行为有所不同,所以可能有一个解决方法

因此,首先,创建一个mosquitto将收听的文件,比如
touch temperature.pool
然后把它绑在一个开着的mosquitto_酒吧

尾部温度.游泳池| mosquitto_pub-l--主题/传感器/温度/室外
这不会因为温度的每一次变化就杀死mosquitto_酒吧

然后,将可执行输出馈送到temperature.pool 比如:

temps_radio--格式为“temp_u%n=%v C”>>temperature.pool
这将为每行发布get temp输出,直到其停止。
从这里,您可以向池文件添加任意数量的可执行文件,并将其发布

我可以想到的一个简单解决方案是使用tail,因为您不想重新初始化mqtt,所以不能使用xargs

我在LinuxEnv中对此进行了测试,因为windows的tty行为有所不同,所以可能有一个解决方法

因此,首先,创建一个mosquitto将收听的文件,比如
touch temperature.pool
然后把它绑在一个开着的mosquitto_酒吧

尾部温度.游泳池| mosquitto_pub-l--主题/传感器/温度/室外
这不会因为温度的每一次变化就杀死mosquitto_酒吧

然后,将可执行输出馈送到temperature.pool 比如:

temps_radio--格式为“temp_u%n=%v C”>>temperature.pool
这将为每行发布get temp输出,直到其停止。
从这里,您可以向池文件中添加任意数量的可执行文件,并将其发布

。。。太快了!非常感谢。看起来您可能有一个类似于我的用例;-)。。。太快了!非常感谢。看起来您可能有一个类似于我的用例;-)如何发布到多个不同的主题?如何发布到多个不同的主题?