MQTT no Raspberry – coleta, broker e monitoramento

MQTT no Raspberry

Pensei que seria bom fazer um setup completo e simples para quem ainda não experimentou MQTT no Raspberry. Vamos configurar um broker, coletar uns dados de forma bem simples no Raspberry e vamos visualizar isso em um aplicativo bacana para smartphone.

Configurar broker MQTT

O broker pode estar no próprio Raspberry ou em um servidor remoto, como preferir. Vale lembrar que já escrevi um artigo dedicado à criação de um broker MQTT no Raspberry utilizando o Mosquitto, mas esse artigo será bem mais objetivo.

Como vamos fazer a coleta também no próprio Raspberry, já instalemos também o client, que será nosso “facilitador”, dispensando inclusive qualquer programação.

sudo su
apt-get update
apt-get install -y mosquitto mosquitto-clients

Com isso, podemos partir para a configuração do broker. Não vou entrar em detalhes de conceitos, só vou citar que MQTT significa “Message Queue Telemetry Transport”, um protocolo leve para IoT criado pela IBM em 1999. Basicamente, um protocolo M2M (Machine To Machine), onde o intermediário é chamado de broker, com papel exclusivo de intercambiar as mensagens sem que os pontos tenham qualquer conhecimento da estrutura de rede das pontas. Instalar o broker no próprio Raspberry é uma maneira de facilitar as coisas, dispensando contratação de servidor e se tiver uma resolução de nome gratuita, o serviço pode ser exposto na Internet, e assim permitir a telemetria remota – de outro modo, apenas na rede local (o que pode ser até ideal, dependendo da necessidade).

Edite o arquivo /etc/mosquitto/mosquitto.conf e deixe-o assim:

# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /var/run/mosquitto.pid


log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

#nao permitir acesso anonimo
allow_anonymous false 
#...
autosave_interval 1800
#...
connection_messages true
#destino das msgs de log. Pode apontar pra quantas quiser, uma por linha
log_dest stderr
log_dest topic
#tipos de erro. Tem mais alguns nessa ultima versao, mas aqui ja me basta
log_type error
log_type warning
log_type notice
log_type information
log_type debug
#...
log_timestamp true
#arquivo de passwd, criado mais adiante
password_file /etc/mosquitto/dobitaobyte.pw
#arquivo de acl, descrito e criado mais adiante
acl_file /etc/mosquitto/dobitaobyte.acl
#para gravar os dados em disco
persistence true
#destino da base de dados.
persistence_location /opt/mosquitto/mosquitto_db
#nome para o arquivo de persistencia de dados 
persistence_file mosquitto.db
#tempo para descarregar da memoria para o disco  
persistent_client_expiration 1m  
#um sinonimo de persistence, nao precisa dessa repeticao
retained_persistence true
#abre 1883 em localhost, apenas IPv4
#listener 1883 127.0.0.1
listener 1883 :::::: COLOQUE O IP DO BROKER AQUI ::::::
#abre em todas as interfaces na 8883, IPv4 e IPv6 (e pode ter mais)
listener 8883
#certificados criados adiante
#tls_version tlsv1
#cafile /etc/mosquitto/certs/ca.crt
#certfile /etc/mosquitto/certs/server.crt
#keyfile /etc/mosquitto/certs/server.key
require_certificate false

Não esqueça de mudar ao menos a linha listener 1883, colocando o IP do broker, seja rede local ou IP público.

Edite o arquivo /etc/mosquitto/dobitaobyte.acl e coloque as regras:

topic read $SYS/#
topic test/#

user dobitaobyte
topic write /status/#
topic read /status/#

topic write /cmd/#
topic read /cmd/#

Já é mais que o suficiente para basicamente tudo o que for necessário. Nos exemplos de uso mais adiante ficará claro.

Crie o arquivo vazio /etc/mosquitto/dobitaobyte.pw e em seguida crie a senha para o usuário que for criado. No exemplo, vou criar o usuário dobitaobyte, como definido na regra da ACL.

touch /etc/mosquitto/dobitaobyte.pw
mosquitto_passwd /etc/mosquitto/dobitaobyte.pw dobitaobyte

Se preciso for, para excluir o usuário podemos usar:

mosquitto_passwd -D /etc/mosquitto/dobitaobyte.pw dobitaobyte

O serviço deverá iniciar automaticamente no reboot, mas no primeiro momento é bom deixar executando em primeiro plano para depuração.

sudo su
service mosquitto stop
mosquitto -v -c /etc/mosquitto/mosquitto.conf

Agora vamos criar umas coletas.

Publicar no MQTT broker com Raspberry

Podemos tanto publicar como subscrever-se aos tópicos criados. Um conceito básico: criamos uma acl chamada /status/#, o que significa que podemos criar multiníveis dentro da raiz /status. Por exemplo, /status/CLIENT_ID/memory/used, onde CLIENT_ID pode ser o hostname, facilitando a automação para múltiplos hosts.

Para publicar exatamente nesse tópico de exemplo, podemos fazer:

mosquitto_pub -h $192.168.1.100 -u dobitaobyte -P senhaEscolhida -t /status/meuRPi/memory/used -m 10 -i meuRPi

Um exemplo de uma mensagem qualquer na janela em que deixamos o broker rodando em primeiro plano:

Se quisermos automatizar o processo criando um serviço de sistema para publicar periodicamente, podemos criar um script shell e convertê-lo em serviço. Abaixo, um exemplo de script shell para publicar informações da memória RAM:

#!/bin/bash

CLIENT_ID=`hostname -s`
USERNAME='dobitaobyte'
PASSWD='aSenhaDeSempre'
BROKER='192.168.1.100'
PUBLISH_INTERVAL==60 # 1x por minuto
FS_STATUS_RO=('NAO' 'SIM')

publisher(){
        #faz o envio da informacao $2 para o topico $1
        mosquitto_pub -h $BROKER -u $USERNAME -P $PASSWD -t $1 -m $2 -i $CLIENT_ID
}

getValues(){
    echo ""
    echo "Starting a new cycle:"
    #MEMORIA - /status/$CLIENT_ID/memory/{used,free,shared,cache,available}
    #USADO    LIVRE    COMPARTILHADO    CACHE    DISPONIVEL
    echo -n "Sending memory usage..."
    MEM=(`free -m|head -n2|tail -n1|awk '{print $3" "$4" "$5" "$6" "$7}'`)
    #echo ${MEM[0]} #primeiro item
    publisher "/status/$CLIENT_ID/memory/used" ${MEM[0]}
    sleep 0.25
    publisher "/status/$CLIENT_ID/memory/free" ${MEM[1]}
    sleep 0.25
    publisher "/status/$CLIENT_ID/memory/shared" ${MEM[2]}
    sleep 0.25
    publisher "/status/$CLIENT_ID/memory/cache" ${MEM[3]}
    sleep 0.25
    publisher "/status/$CLIENT_ID/memory/available" ${MEM[4]}
    sleep 0.25
    echo -e "\t\t[OK]"
}

while [ true ]; do
   getValues
   sleep $PUBLISH_INTERVAL
done

Para transformar em serviço de sistema, é só seguir o procedimento desse artigo.

Estou desenvolvendo um projeto completo com muito mais coisas (do qual não posso falar a respeito). A saída do meu script fica assim:

MQTT no Raspberry - script

Tem uma linha sem formatação porque tive que fazer depuração da função RAMFS e não voltei ao padrão ainda.

Com um script elaborado, elimina-se a necessidade de acesso para diagnósticos. Se subscrevendo a tópicos, podemos disparar comandos remotos e coletar informações específicas, reiniciar o sistema, instalar algum programa etc.

Aplicativo MQTT para Android

Existem diversos e infelizmente alguns utilizam o mesmo nome, mas atualmente estou bastante satisfeito com o MQTT Dashboard, que você encontra na Play Store para Android. Esse é o início do meu dashboard ainda. Ele tem inclusive a possibilidade de rodar em segundo plano e gerar alarmes. Excelentes recursos!

MQTT no Raspberry - MQTT Dashboard

A proteção do SD é a conversão do sistema em read-only para aumentar a vida útil do cartão. O cache em RAM é um cache sendo feito na RAMFS. Com isso, consigo saber se o cache está sendo o suficiente e caso tenha passado o SD para read-write (para instalar um programa, por exemplo), o aplicativo me mostrará que esqueci de voltar ao estado de proteção. Se desejar fazer a proteção do seu SD, siga esse tutorial.

Outros recursos exibidos tem seu propósito, mas fazem parte de um projeto específico, como citado anteriormente.

Esse aplicativo para Android permite também criar pastas de categorias. Por exemplo, a pasta acima é a de sistema. Criei uma pasta de rede também e assim consigo filtrar as informações que desejo ver.

MQTT no Raspberry

Também podemos escolher o ícone do widget, cor de fundo, personalizar ação e mais um monte de coisas.

Onde comprar Raspberry?

Algumas boas opções são a Curto-Circuito e também a Saravati – que tem a versão 4.  A MASUGUX tem algumas versões do RPi 4 também, por isso recomendo que visite todos e faça sua escolha.

Em um próximo artigo pretendo apresentar um dashboard web incrível e que vai muito bem com MQTT, é só aguardar!

 

Revisão: Ricardo Amaral de Andrade