mqtt - MQTT:使用标准输入的 mosquitto_pub 发布多个主题
问题描述
我有一个简单的程序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_sub
支持用户格式化的输出,这使得将其输出到另一个程序中变得很好,比如
$ 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
推荐阅读
- java - 我正在尝试链接包中的 JSP 和 Java 文件,因为我在 Conn.java 类中建立了 JDBC 连接
- python - 获取类成员名称作为字符串
- json - 用于创建用户并添加到服务台的 Powershell 脚本突然无法正常工作
- java - JFileChooser 用扩展名保存
- security - 使用 Burpsuite 修改请求被认为是有效的安全漏洞?
- excel - 将下拉选择链接到切片器
- java - 获取两个arrayList之间的差异,但以大写形式比较它们
- unreal-engine4 - Unreal Engine 4.20 build error in plugin: [Adaptive unity build] Disabling PCH for exclude files
- html - 包装器 div 旁边的空白
- scala - 如何在 Spark2 中对具有数百万条记录(每日增量加载)的文件生成序列