Como inscrever um script Bash como um cliente MQTT

1

Do meu entendimento:

  • O cliente pode ser qualquer dispositivo, desde que tenha uma biblioteca MQTT em execução, de um microcontrolador para um servidor, mas deve estar conectado a um broker do MQTT em qualquer rede

  • O corretor é responsável por receber todas as mensagens e enviá-las aos clientes inscritos.

Então, no momento, tenho um script bash que filtra dados específicos do fluxo do MQTT. As informações filtradas são armazenadas em um arquivo csv e, posteriormente, são chamadas para atualizar uma tabela do MySQL.

P: Como posso fazer com que meu script bash (que atualiza a tabela MySQL) seja inscrito no broker MQTT como um cliente, assim toda vez que novos dados forem enviados eu posso enviar / enviá-lo para a tabela MySQL.

    
por 3kstc 06.03.2015 / 04:44

2 respostas

3

Pessoalmente, achei o bish-bosh um pouco complicado para o meu gosto. Eu não sou muito bom com o sql, mas vou dar uma olhada na parte do mqtt. Você precisará de um ouvinte executando o mosquitto_sub para ler e executar comandos, e no seu terminal você precisa se inscrever em um fluxo de saída. Finalmente, você precisará de um manipulador para enviar comandos. Para um ouvinte, você pode tentar algo assim:

#!/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

Isso funciona bem, a menos que você esteja tentando transmitir coisas, caso em que você precisará codificá-lo de alguma forma ou sedimentar novas linhas. Mas isso deve funcionar simplesmente enviando comandos pelo mqtt.

De inscrever-se no fluxo de saída para ver a saída do shell.

mosquitto_sub -h $host -t input

Finalmente, para um manipulador, algo assim:

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

Do que você pode rodar isso em uma sessão do tmux junto com o handler e você tem um shell interativo: Janela 1:

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

Janela 2:

This is an interactive mqtt shell!
    
por 04.04.2016 / 17:14
1

Você viu bish-bosh? Deve fazer o trabalho.

MQTT shell script client, for bash, dash, BusyBox ash and others

link

    
por 06.03.2015 / 17:51