Publicando mensagens no Broker MQTT com BananaPi e Python

Imagine controlar um LED remotamente e ainda ser notificado sobre seu estado em tempo real. Este artigo mostra como criar um sistema de Notificação de LED com MQTT, usando uma BananaPi, Python e o protocolo MQTT para enviar dados para a plataforma HiveMQ Cloud. Você vai aprender a configurar tudo, desde o hardware até o software, para monitorar o estado de um LED através da web.

O que você precisa para começar

Para seguir este tutorial, você vai precisar de alguns componentes e conhecimentos básicos. Primeiramente, é necessário ter uma BananaPi com Python 3.9 instalado, além das bibliotecas pyenv, paho-mqtt e python-dotenv. Também é importante ter um arquivo de credenciais .env para armazenar informações de segurança e uma conta no HiveMQ com as credenciais configuradas.

  • BananaPi: Python 3.9
  • BananaPi: Biblioteca Python — pyenv
  • BananaPi: Biblioteca Python — paho-mqtt
  • BananaPi: Biblioteca Python — python-dotenv
  • BananaPi: Arquivo de credenciais .env
  • HiveMQ: Credencial de Segurança

Entendendo o protocolo MQTT

O MQTT (Message Queuing Telemetry Transport) é um protocolo de mensagens amplamente utilizado na Internet das Coisas (IoT). Ele permite que dispositivos publiquem e assinem tópicos para trocar dados pela internet. É ideal para conectar microcontroladores, sensores e CLPs industriais de forma eficiente.

Como o MQTT funciona?

  1. Publicador (Publisher): Envia mensagens para um tópico específico.
  2. Mediador (Broker): Recebe as mensagens e as distribui para os inscritos no tópico.
  3. Assinante (Subscriber): Recebe as mensagens ao se inscrever em um ou mais tópicos.

O MQTT utiliza o padrão de comunicação publicar/assinar (Publish/Subscribe), onde o remetente e o assinante se comunicam através de tópicos, sem necessitar de uma conexão direta. O Broker MQTT é o responsável por filtrar e distribuir as mensagens corretamente.

Características importantes do MQTT

  • Mensagens baseadas em Tópicos: A comunicação é organizada em tópicos, como “sensores/temperatura/sala”.
  • Baixa latência: Ideal para redes com poucos recursos e aplicações IoT.
  • QoS (Quality of Service): Garante a entrega das mensagens com diferentes níveis de garantia (0, 1 ou 2).
  • Persistência: Permite armazenar mensagens para entregar a clientes que estão temporariamente desconectados.

Brokers MQTT populares

  • Mosquitto (Open-source, ideal para IoT)
  • EMQX (Escalável, adequado para grandes aplicações)
  • HiveMQ (Focado em soluções empresariais)

HiveMQ: a plataforma de mensagens IoT na nuvem

O HiveMQ Cloud é uma plataforma de mensagens IoT totalmente gerenciada e nativa da nuvem. Ela facilita a conectividade confiável e escalável de dispositivos IoT. Com o HiveMQ, você pode simplificar a troca de dados entre seus dispositivos e aplicações na nuvem.

Conhecendo a BananaPi M2 Zero

A BananaPi M2 Zero é um computador de placa única ultracompacto, medindo apenas 60 mm x 30 mm. Equipada com um processador quad-core Cortex A7 Allwinner H2+ e 512 MB de RAM, é perfeita para sistemas leves e aplicações com espaço limitado. Além disso, suporta sistemas operacionais Linux e Android.

Especificações da BananaPi M2 Zero

  • CPU Quad Core ARM Cortex A7 H2+
  • 512 MB de SDRAM
  • WiFi (AP6212) e Bluetooth integrados
  • Mini-HDMI

Visão geral do projeto de Notificação de LED com MQTT

Neste projeto, vamos usar os seguintes componentes do protocolo MQTT:

  • Publicador (Publisher): BananaPi M2 Zero
  • Mediador (Broker): Amazon Web Services (AWS)
  • Assinante (Subscriber): Hive Web Client

Como a BananaPi se encaixa no projeto?

Um LED será conectado a um pino GPIO da BananaPi e controlado via Shell Script em uma classe Python. A cada mudança no estado do LED, o estado lógico do pino será lido. A BananaPi fará login no Broker da HiveMQ Cloud, registrará no tópico “bananapi” e enviará a notificação do estado lógico do pino.

Utilizando o Hive Web Client

Após se cadastrar na plataforma HiveMQ, configure as credenciais que serão usadas pela BananaPi e pelo Web Client, incluindo usuário, senha e nível de acesso (publicação, assinatura ou ambos). Em seguida, faça login no Web Client com as credenciais e assine o tópico “bananapi”. Assim, todas as mensagens enviadas pela BananaPi serão exibidas no Web Client.

Montando o circuito eletrônico

Para este projeto, utilizaremos o pino GPIO7 (pino físico 29) e o GND3 (pino físico 6), conforme demonstrado em um artigo anterior sobre como piscar um LED utilizando BananaPi e Python via SSH.

Configurando o HiveMQ Cloud

Para usar o Web Client da HiveMQ, é necessário criar uma conta gratuita. Depois, cadastre uma nova credencial de segurança para autenticar a BananaPi no Broker MQTT. Essa credencial deve incluir:

  • Username: Nome de usuário
  • Password: Senha do usuário
  • Permission: Tipo de permissão do protocolo MQTT (Publish only, Subscribe only ou Publish and Subscribe)

Conectando ao Web Client

Para se conectar ao Web Client, insira o nome de usuário e senha da credencial de segurança. Após a conexão, assine o tópico desejado para receber as mensagens. Ao configurar a assinatura, você precisará definir:

  • Topic: Canal de comunicação, semelhante a um filtro de mensagens
  • QoS: Qualidade de Serviço, que define a garantia de entrega das mensagens (QoS 0, QoS 1 ou QoS 2)

Passo a passo do algoritmo

Do ponto de vista da BananaPi, o algoritmo seguirá as seguintes etapas:

  1. Login: Estabelecer conexão remota via SSH entre o computador e a BananaPi.
  2. Comando Shell: Executar o arquivo BlinkPublishMQTT via terminal do Linux na BananaPi.
  3. BlinkPublishMQTT: Iniciar a conexão remota com o Broker.
  4. BlinkPublishMQTT: Enviar mensagem para o Broker sinalizando a realização do login.
  5. BlinkPublishMQTT: Configurar o pino GPIO7 da BananaPi para saída.
  6. BlinkPublishMQTT: Imprimir a pergunta no terminal do Linux para ligar ou desligar o LED.
  7. BlinkPublishMQTT: Escrever o estado lógico do pino GPIO7, escolhido pelo usuário.
  8. BlinkPublishMQTT: Ler o estado lógico do pino GPIO7.
  9. BlinkPublishMQTT: Enviar mensagem para o Broker notificando o estado lógico atual do pino GPIO7.
  10. BlinkPublishMQTT: Desativar o pino GPIO7 da BananaPi.
  11. BlinkPublishMQTT: Enviar mensagem para o Broker sinalizando a realização do logout.

Implementando o código em Python

Configurando as credenciais

Para executar o código, crie um arquivo .env para armazenar as credenciais de segurança:

  • MQTT_CLIENT_USERNAME = nome de usuário cadastrado no HiveMQ
  • MQTT_CLIENT_PASSWORD = senha cadastrada no HiveMQ
  • MQTT_CLIENT_URL = endereço da URL do Cluster do HiveMQ

Essas credenciais são essenciais para a autenticação no Broker e o envio das mensagens.

Classe BlinkPublishMQTT.py

Atenção: Esta classe foi implementada para ser executada apenas em ambiente Linux, como a BananaPi. Se executada em outros sistemas (Windows ou macOS), não funcionará.

Enviando o arquivo via SSH

Envie os arquivos BlinkPublishMQTT.py e .env para a BananaPi usando os seguintes comandos Shell:

$ scp /Users/henriqueotogami/bananapi/python/.env [email protected]:otogamidev/
$ scp /Users/henriqueotogami/bananapi/python/BlinkPublishMQTT.py [email protected]:otogamidev/

Acessando a BananaPi via SSH

Para acessar a BananaPi, autentique-se via SSH com o seguinte comando:

$ ssh [email protected]

Verificando a existência do arquivo

Certifique-se de que o arquivo BlinkPublishMQTT.py foi enviado corretamente, navegando até o diretório do projeto e listando os arquivos:

$ cd ~/otogamidev/
$ ls -la

Instalando as bibliotecas necessárias

Instale as bibliotecas python-dotenv, pyenv e paho-mqtt na BananaPi:

$ pip3 install python-dotenv
$ curl -fsSL https://pyenv.run | bash

Para o pyenv, siga as instruções para configurar as variáveis de ambiente e baixar os pacotes de bibliotecas de desenvolvimento. Em seguida, instale a biblioteca paho-mqtt:

$ pip3 install paho-mqtt

Executando o código

Execute o arquivo BlinkPublishMQTT.py com o seguinte comando:

$ python3 BlinkPublishMQTT.py

Durante a execução, as notificações de mudança de estado lógico do LED serão enviadas ao Broker. Além disso, o código implementa a consulta do horário atual para ser anexada em cada mensagem.

Com o HiveMQ Cloud, você pode simplificar a troca de dados entre seus dispositivos e aplicações na nuvem, como também pode conferir mais informações sobre as últimas novidades da SamMobile.

Considerações finais

Este projeto demonstra como utilizar a BananaPi e o protocolo MQTT para monitorar o estado de um LED remotamente. A implementação envolve o gerenciamento de pinos GPIO, leitura e escrita de arquivos via Shell, acesso remoto via SSH, criação de um ambiente isolado com Python e a utilização do MQTT em Python. Além disso, a arquitetura do protocolo MQTT proporciona um desacoplamento eficiente entre os componentes.

Substituindo os.system() por subprocess.run()

Inicialmente, a função os.system() era utilizada para gerenciar os pinos GPIO, mas ela cria um subshell e não oferece controle sobre a saída e tratamento de erros. A função subprocess.run(), por outro lado, permite maior controle e impede a injeção de comandos, além de parecer mais estável.

Desacoplamento da arquitetura MQTT

Diferente de uma arquitetura cliente-servidor tradicional, o protocolo MQTT funciona de forma distribuída. As mensagens publicadas são recebidas pelo Broker e repassadas aos assinantes, sem tratamento de dados, apenas encaminhamento. Isso reduz a necessidade de dispositivos IoT implementarem protocolos complexos para comunicação segura.

Este conteúdo foi auxiliado por Inteligência Artificiado, mas escrito e revisado por um humano.

Leave a Comment