首页 > 解决方案 > 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)。

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

我希望用例“将键值行流输入 MQTT ”是一种很常见的情况。例如,在另一端,mosquitto_sub支持用户格式化的输出,这使得将其输出到另一个程序中变得很好,比如

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

标签: mqttmosquitto

解决方案


不,您必须编写一个程序/脚本来执行此操作。

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

推荐阅读