Shell-Script

如何以 MQTT 客戶端訂閱 Bash 腳本

  • June 10, 2020

據我了解:

  • 客戶端可以是任何設備,只要它上面執行著 MQTT 庫,從微控制器到伺服器,但必須通過任何網路連接到 MQTT 代理
  • Broker 負責接收所有消息,並將這些消息發送給訂閱的客戶端。

所以目前我有一個 bash 腳本,可以從 MQTT 流中過濾掉特定數據。然後將過濾後的資訊儲存到 csv 文件中,然後呼叫它來更新 MySQL 表。

**問:**我怎樣才能讓我的 bash 腳本(更新 MySQL 表)作為客戶端訂閱到 MQTT 代理,所以每次發送新數據時,我都可以將其推送/發送到 MySQL 表。

就我個人而言,我發現 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!

引用自:https://unix.stackexchange.com/questions/188525