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
$ 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输出,直到其停止。
从这里,您可以向池文件中添加任意数量的可执行文件,并将其发布。。。太快了!非常感谢。看起来您可能有一个类似于我的用例;-)。。。太快了!非常感谢。看起来您可能有一个类似于我的用例;-)如何发布到多个不同的主题?如何发布到多个不同的主题?