如何作为 MQTT 客户端订阅 Bash 脚本

如何作为 MQTT 客户端订阅 Bash 脚本

据我了解:

  • 客户端可以是任何设备,只要其上运行 MQTT 库即可,从微控制器到服务器,但必须通过任何网络连接到 MQTT 代理

  • Broker负责接收所有消息,并将这些消息发送给订阅的客户端。

所以目前我有一个 bash 脚本可以从 MQTT 流中过滤掉特定数据。然后,过滤后的信息将存储到 csv 文件中,并在稍后调用以更新 MySQL 表。

问:我怎样才能使我的 bash 脚本(更新 MySQL 表)作为客户端订阅 MQTT 代理,以便每次发送新数据时我都可以将其推送/发送到 MySQL 表。

答案1

就我个人而言,我发现 bish-bosh 有点过于复杂,不适合我的口味。我不太擅长 sql,但我会尝试一下 mqtt 部分。您将需要一个运行 mosquitto_sub 的侦听器来读取和执行命令,并且在您的终端上您需要订阅输出流。最后,您将需要一个处理程序来发送命令。对于听众来说,你可以尝试这样的事情:

#!/bin/bash
##########################
# MQTT Shell Listen & Exec
host=$2
clean="output input cmds";p="backpipe";pid=$(cat pidfile)
ctrl_c() {
  echo "Cleaning up..."
  rm -f $p;rm "$clean";kill $pid 2>/dev/null
  if [[ "$?" -eq "0" ]];
  then
     echo "Exit success";exit 0
  else
     exit 1
  fi
}

listen(){
([ ! -p "$p" ]) && mkfifo $p
(mosquitto_sub -h $host -t input >$p 2>/dev/null) &
echo "$!" > pidfile
while read line <$p
do
  echo $line > cmds
  if grep -q "quit" cmds; then
    (rm -f $p;rm $clean;kill $pid) 2>/dev/null
    break
  else
    (bash cmds | tee out) && mosquitto_pub -h $host -t output -f out;>out
  fi
done
}

usage(){
echo "    Mqtt-Exec Listener Via Bash"
echo "  Usage: $0 <mqtt server>"
echo "  Subscripe to topic \"output\", publish to topic \"input\""
}

case "$1" in
-h|--host)
trap ctrl_c INT
listen
;;
*)
usage
exit 1
;;
esac

这工作得很好,除非你试图流式传输内容,在这种情况下,你需要以某种方式对其进行编码,或者发出新行。但是,这应该适用于通过 mqtt 发送命令。

然后订阅输出流,这样您就可以看到 shell 输出。

mosquitto_sub -h $host -t input

最后,对于处理程序,如下所示:

#!/bin/sh
cmds="$@"
echo $cmd | mosquitto_pub -h $host -t input -l
exit

您可以在 tmux 会话中与处理程序一起运行它,并且您有一个交互式 shell:窗口 1:

./handle echo "This is an interactive mqtt shell!"

窗口2:

This is an interactive mqtt shell!

答案2

我会用它xargs来做这份工作。例如

mosquitto_sub -h <yourhost> -t <yourtopic> | xargs -I %output% ./handleMessage.sh %output%

或者,根据代码的复杂性,您可以直接执行将值写入 MySQL-DB 的命令。

$1否则,您可以通过handle.sh 脚本访问 MQTT 输出

示例脚本:

#!/bin/bash
echo "$1" >> MQTT-Values.csv
# Enter your command to write to MySQL here

我更喜欢使用这段代码,mosquitto_sub因为它非常轻量级,易于理解,因此可维护。

答案3

你见过比什-波什吗?它应该可以完成这项工作。

MQTT shell 脚本客户端,适用于 bash、dash、BusyBox ash 等

https://github.com/raphaelcohn/bish-bosh

答案4

对我来说,bish-bosh 也太复杂了。我什至无法让它在我的桌面 ubuntu 系统上工作,我可能永远不会将它连接到运行 busybox 的路由器上。我使用 Chev_603s 脚本并用它制作了一个 mqtt 记录器。我把它放在github上:https://github.com/pkoevesdi/MQTT-Logger。每个人都可以随意使用和改进它。

相关内容