Bash 스크립트를 MQTT 클라이언트로 구독하는 방법

Bash 스크립트를 MQTT 클라이언트로 구독하는 방법

내가 이해하는 한도에서는:

  • 클라이언트는 MQTT 라이브러리가 실행되는 한 마이크로컨트롤러부터 서버까지 모든 장치가 될 수 있지만 모든 네트워크를 통해 MQTT 브로커에 연결되어야 합니다.

  • 브로커는 모든 메시지를 수신하고 이러한 메시지를 구독된 클라이언트에게 보내는 일을 담당합니다.

그래서 현재 MQTT 스트림에서 특정 데이터를 필터링하는 bash 스크립트가 있습니다. 필터링된 정보는 csv 파일에 저장되고 나중에 MySQL 테이블을 업데이트하기 위해 호출됩니다.

묻다:MySQL 테이블을 업데이트하는 bash 스크립트를 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를 통해 명령을 보내는 데 작동합니다.

그런 다음 출력 스트림을 구독하여 셸 출력을 볼 수 있습니다.

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!

답변2

xargs업무용으로 사용하겠습니다 . 예를 들어

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

또는 코드의 복잡성에 따라 MySQL-DB에 값을 쓰는 명령을 직접 실행할 수 있습니다.

$1그렇지 않으면 handler.sh 스크립트를 통해 MQTT 출력에 액세스할 수 있습니다.

예시 스크립트:

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

나는 이 코드를 선호하는데, mosquitto_sub그 이유는 이 코드가 매우 가볍고, 이해하기 쉽고, 유지 관리가 용이하기 때문입니다.

답변3

비쉬 보쉬(Bish Bosh)를 만난 적이 있나요? 그것은 일을 해야 합니다.

bash, dash, BusyBox ash 등에 적합한 MQTT 쉘 스크립트 클라이언트입니다.

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

답변4

나에게 bish-bosh는 너무 복잡하다. 내 데스크탑 우분투 시스템에서 작동하도록 할 수도 없으며 아마도 비지박스를 실행하는 라우터에 연결하지 않을 것입니다. 저는 Chev_603s 스크립트를 사용하여 mqtt 로거를 만들었습니다. 나는 그것을 github에 올렸습니다 :https://github.com/pkoevesdi/MQTT-Logger. 누구나 자유롭게 사용하고 개선할 수 있습니다.

관련 정보