mosquitto_sub 和 grep 触发命令/动作

物联网 MQTT 蚊子
2021-05-30 17:13:53

我可以mosquitto_sub用来订阅特定主题的代理,比如test_topic

mosquitto_sub -h MOSQUITTO_BROKER_HOSTNAME -t test_topic

我也可以用管道 grep 指定一个特定的关键字,比如Valve_closed

mosquitto_sub -h MOSQUITTO_BROKER_HOSTNAME -t test_topic | grep "valve_closed"

每次该特定主题广播“阀门关闭”消息时,这只会输出带有“valve_closed”的换行符。

输入,

第 1 行: mosquitto_sub -h MOSQUITTO_BROKER_HOSTNAME -t test_topic | grep "valve_open"

第 2 行: mosquitto_sub -h MOSQUITTO_BROKER_HOSTNAME -t test_topic | grep "valve_closed"

输出,

第 1 行: valve_closed


现在,我的问题是,如何通过管道传输命令,如果grep "valve_closed"为真,则执行另一个命令。

我试过像echo "Okay so now Valve is Closed"另一个|管道命令一样链接一个命令,

mosquitto_sub -h MOSQUITTO_BROKER_HOSTNAME -t test_topic | grep "valve_closed" | echo "Okay, so now Valve is Closed"

但这只是运行带有 output 的 echo 命令"Okay, so now Valve is Closed",即使我在括号内将 grep+echo 分组。

我也尝试使用 AND 运算符&&

mosquitto_sub -h MOSQUITTO_BROKER_HOSTNAME -t test_topic | grep "valve_closed" && echo "Okay, so now Valve is Closed"

虽然这会等待 grep 在valve_closed找到匹配项后立即匹配字符串,但它会执行echo "Okay, so now Valve is Closed".

我也尝试过使用 if 语句,但是任何包含条件语句似乎都打破了轮询性质,message_sub它不断监视给定主题并打印出其输出。

我对如何使用 mosquitto_sub 检索消息并根据消息内容执行 shell 命令/脚本有点迷茫。谢谢阅读。

1个回答

这里的问题是mosquitto_sub永远不会返回(默认情况下),因此它的输出永远不会结束,因此不能用于测试。

您会做得更好,不要尝试在 shell 脚本中执行此操作并使用诸如 python 之类的东西。

编辑:

如果您真的必须在不编写任何内容的情况下执行此操作(相信我这是值得的),那么您可以使用 mqtt-exec (尽管它需要安装 nodejs)

https://github.com/denschu/mqtt-exec