我有一个简单的程序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_radio
将awk
的输出分布到这些管道中。
真的有必要为此编写自己的程序或脚本吗?
我希望用例“ 将键值行输入到MQTT ”是一种很常见的情况。
例如,在另一端,mosquitto_pub
支持用户格式化的输出,这使得将其通过管道传输到另一个程序(如
$ mosquitto_sub -t /sensors/temps/# -F "UPDATE Temperatures(%t, %p)" | mysqlcli
答案 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