【问题标题】:MQTT: publish multiple topics with mosquitto_pub from stdinMQTT:使用标准输入的 mosquitto_pub 发布多个主题
【发布时间】:2020-09-27 10:45:30
【问题描述】:

我有一个简单的程序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从中读取,然后分发@ 987654334@ 使用一些awk 输出到这些管道中。

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

我希望用例“将键值行流输入 MQTT”很常见。 例如,在另一端,mosquitto_sub supports user-formatted output,它可以很好地将其输出到另一个程序中,比如

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

【问题讨论】:

    标签: mqtt mosquitto


    【解决方案1】:

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

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

    【讨论】:

    • ...这很快!谢谢!看起来你可能有类似我的用例;-)
    【解决方案2】:

    我能想到的一个简单的解决方案是使用 tail,因为你不想重新启动 mqtt,所以你不能用 xargs 来做。

    我在 linux 环境中对此进行了测试,因为它的 tty 行为不同,所以可能有一种适用于 windows 的解决方法。

    首先,创建一个 mosquitto 可以收听的文件,例如 touch temperature.pool 然后将其绑定到打开的 mosquitto_pub tail temperature.pool | mosquitto_pub -l --topic /sensors/temp/outside 这不会因为 temperature.pool 的每次变化而杀死 mosquitto_pub

    然后将您的可执行输出提供给 temperature.pool 喜欢: temps_radio --format "temp_%n=%v C" >> temperature.pool 这将发布每行的临时输出,直到它停止。 从这里您可以将任意数量的可执行文件添加到池文件中,它将被发布

    【讨论】:

    • 如何发布到多个不同的主题?
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多