BashスクリプトをMQTTクライアントとして購読する方法

BashスクリプトをMQTTクライアントとして購読する方法

私が理解している制限では:

  • クライアントは、MQTTライブラリーが実行されている限り、マイクロコントローラーからサーバーまで、任意のデバイスにすることができますが、すべてのネットワークを介してMQTTブローカーに接続する必要があります。

  • ブローカーはすべてのメッセージを受信し、これらのメッセージをサブスクライブされたクライアントに送信することを担当します。

したがって、現在MQTTストリームから特定のデータをフィルタリングするbashスクリプトがあります。フィルタ処理された情報はcsvファイルに保存され、後でMySQLテーブルを更新するために呼び出されます。

尋ねる:MySQLテーブルを更新するbashスクリプトをMQTTブローカーにクライアントに購読して、新しいデータが送信されるたびにそれをMySQLテーブルにプッシュ/転送できるようにするにはどうすればよいですか。

ベストアンサー1

個人的には、ビッシュボッシュは私の好みに比べて複雑すぎると思います。私は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を介してコマンドを送信するのに機能します。

その後、出力ストリームを購読してシェル出力を表示できます。

mosquitto_sub -h $host -t input

最後に、ハンドラの場合は次のようになります。

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

ハンドラを使用してtmuxセッションで実行でき、インタラクティブシェルがあります。ウィンドウ1:

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

ウィンドウ2:

This is an interactive mqtt shell!

おすすめ記事