Shell-Script
如何以 MQTT 客戶端訂閱 Bash 腳本
據我了解:
- 客戶端可以是任何設備,只要它上面執行著 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!