Como publicar mensagens no Broker MQTT usando a BananaPi e Python
Introdução Este artigo demonstrará um sistema de notificação dos estados de um LED (ligado/desligado) para um Broker do protocolo MQTT do HiveMQ Cloud, com assinatura do tópico de destino das mensagens no Web Client da plataforma, utilizando o microcomputador BananaPi com Python e comandos Shell no Linux Debian embarcado. Sumário Requisitos O que é o protocolo MQTT ? O que é o HiveMQ ? O que é a BananaPi ? Visão panorâmica do projeto Circuito Eletrônico HiveMQ Cloud Algoritmo Código em Python Conclusão Referências 01. Requisitos 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 02. O que é o protocolo MQTT ? MQTT é o protocolo de mensagens mais comumente usado para a Internet das Coisas (IoT). MQTT significa Message Queuing Telemetry Transport. O protocolo define como dispositivos IoT publicam e assinam tópicos para receber dados pela internet. O MQTT é usado para troca de mensagens e dados entre dispositivos IoT e IoT industrial (IIoT), como microcontroladores, sensores e CLPs industriais. O protocolo é orientado a eventos e conecta dispositivos usando o padrão publicar/assinar (Publish/Subscribe). O remetente (Publisher) e o assinante (Subscriber) se comunicam por meio de Tópicos e são desacoplados um do outro. A conexão entre eles é tratada pelo mediador (Broker) MQTT. O broker MQTT filtra todas as mensagens recebidas dos Publishers e as distribui corretamente para os Subscribers. [1] Como funciona: Publicador (Publisher): Dispositivo ou aplicação que envia mensagens para um tópico específico. Mediador (Broker): Recebe as mensagens publicadas e distribui para os dispositivos que estão inscritos nesse tópico. Assinante (Subscriber): Dispositivo ou aplicação que recebe mensagens ao estar inscrito em um ou mais tópicos. Excalidraw — Visão panorâmica do funcionamento do protocolo MQTT — [05] Características principais: Mensagens baseadas em Tópicos: A comunicação é organizada em tópicos (exemplo: sensores/temperatura/sala). Baixa latência: Ideal para IoT e redes com poucos recursos. QoS (Quality of Service): Define garantias de entrega das mensagens (0, 1 ou 2). Persistência: Pode armazenar mensagens para entregar a clientes desconectados. Exemplos de Brokers MQTT populares: Mosquitto (Open-source, muito usado para IoT) EMQX (Escalável, boa para aplicações grandes) HiveMQ (Focado em soluções empresariais) 03. O que é o HiveMQ ? O HiveMQ Cloud é uma plataforma de mensagens de IoT nativa da nuvem e totalmente gerenciada que simplifica a conectividade confiável e escalável de dispositivos de IoT. [1] Tela Inicial do HiveMQ — [15] 04. O que é a BananaPi ? A BananaPi M2 Zero é um computador de placa única ultracompacto com dimensões de 60 mm x 30 mm. Ele usa um processador quad-core Cortex A7 allwinner H2+, com 512 MB de memória RAM. É ideal para sistemas leves com alguns aplicativos com espaço limitado. Como outros dispositivos da BananaPi, ele suporta os sistemas operacionais Linux e Android. [1] BananaPi BPI-M2 Zero — [02] Principais características CPU Quad Core ARM Cortex A7 H2+ 512 MB de SDRAM. WiFi (AP6212) e Bluetooth integrados. Mini-HDMI. 05. Visão panorâmica do projeto Para desenvolver esse projeto, utilizaremos a seguinte determinação dos componentes do protocolo MQTT: Publicador (Publisher): BananaPi M2 Zero Mediador (Broker): Amazon Web Services (AWS) Assinante (Subscriber): Hive Web Client BananaPi Um LED estará conectado a um pino de GPIO e será acionado (acender / apagar) via Shell Script (comando de terminal) em uma classe Python. A cada acionamento do LED, o estado lógico do pino de GPIO será lido. A BananaPi realizará login no Broker da HiveMQ Cloud e registro no tópico bananapi de mensagens, e enviará a notificação do estado lógico do pino, que foi consultado anteriormente. Hive Web Client Após o cadastro na plataforma HiveMQ, é necessário que seja configurada a credencial que será utilizada pela BananaPi e pelo Web Client, compondo usuário, senha e nível de acesso (publicação, assinatura ou publicação e assinatura). Em seguida, é necessário fazer o login no Web Client utilizando a credencial cadastrada, e assinar o tópico bananapi. Uma vez conectada, todas as mensagens enviadas pela BananaPi serão lidas no Web Client. Excalidraw — Exemplo do desacoplamento e do relacionamento dos componentes do MQTT — [04] A imagem acima exemplifica o relacionamento entre os componentes do protocolo MQTT, destacando o desacoplamento entre eles. Ou seja, o publicador não possui acesso ao(s) assinante(s) da(s) mensagem(ns) que são enviadas por ele ao mediador. Da mesma forma, o(s) assinante(s) também não tem acesso ao(s)

Introdução
Este artigo demonstrará um sistema de notificação dos estados de um LED (ligado/desligado) para um Broker do protocolo MQTT do HiveMQ Cloud, com assinatura do tópico de destino das mensagens no Web Client da plataforma, utilizando o microcomputador BananaPi com Python e comandos Shell no Linux Debian embarcado.
Sumário
- Requisitos
- O que é o protocolo MQTT ?
- O que é o HiveMQ ?
- O que é a BananaPi ?
- Visão panorâmica do projeto
- Circuito Eletrônico
- HiveMQ Cloud
- Algoritmo
- Código em Python
- Conclusão
- Referências
01. Requisitos
- 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
02. O que é o protocolo MQTT ?
MQTT é o protocolo de mensagens mais comumente usado para a Internet das Coisas (IoT).
MQTT significa Message Queuing Telemetry Transport.
O protocolo define como dispositivos IoT publicam e assinam tópicos para receber dados pela internet. O MQTT é usado para troca de mensagens e dados entre dispositivos IoT e IoT industrial (IIoT), como microcontroladores, sensores e CLPs industriais.
O protocolo é orientado a eventos e conecta dispositivos usando o padrão publicar/assinar (Publish/Subscribe).
O remetente (Publisher) e o assinante (Subscriber) se comunicam por meio de Tópicos e são desacoplados um do outro.
A conexão entre eles é tratada pelo mediador (Broker) MQTT.
O broker MQTT filtra todas as mensagens recebidas dos Publishers e as distribui corretamente para os Subscribers. [1]
Como funciona:
Publicador (Publisher): Dispositivo ou aplicação que envia mensagens para um tópico específico.
Mediador (Broker): Recebe as mensagens publicadas e distribui para os dispositivos que estão inscritos nesse tópico.
Assinante (Subscriber): Dispositivo ou aplicação que recebe mensagens ao estar inscrito em um ou mais tópicos.
Excalidraw — Visão panorâmica do funcionamento do protocolo MQTT — [05]
Características principais:
Mensagens baseadas em Tópicos: A comunicação é organizada em tópicos (exemplo: sensores/temperatura/sala).
Baixa latência: Ideal para IoT e redes com poucos recursos.
QoS (Quality of Service): Define garantias de entrega das mensagens (0, 1 ou 2).
Persistência: Pode armazenar mensagens para entregar a clientes desconectados.
Exemplos de Brokers MQTT populares:
- Mosquitto (Open-source, muito usado para IoT)
- EMQX (Escalável, boa para aplicações grandes)
- HiveMQ (Focado em soluções empresariais)
03. O que é o HiveMQ ?
O HiveMQ Cloud é uma plataforma de mensagens de IoT nativa da nuvem e totalmente gerenciada que simplifica a conectividade confiável e escalável de dispositivos de IoT. [1]
Tela Inicial do HiveMQ — [15]
04. O que é a BananaPi ?
A BananaPi M2 Zero é um computador de placa única ultracompacto com dimensões de 60 mm x 30 mm. Ele usa um processador quad-core Cortex A7 allwinner H2+, com 512 MB de memória RAM.
É ideal para sistemas leves com alguns aplicativos com espaço limitado. Como outros dispositivos da BananaPi, ele suporta os sistemas operacionais Linux e Android. [1]
BananaPi BPI-M2 Zero — [02]
Principais características
- CPU Quad Core ARM Cortex A7 H2+
- 512 MB de SDRAM.
- WiFi (AP6212) e Bluetooth integrados.
- Mini-HDMI.
05. Visão panorâmica do projeto
Para desenvolver esse projeto, utilizaremos a seguinte determinação dos componentes do protocolo MQTT:
- Publicador (Publisher): BananaPi M2 Zero
- Mediador (Broker): Amazon Web Services (AWS)
- Assinante (Subscriber): Hive Web Client
BananaPi
Um LED estará conectado a um pino de GPIO e será acionado (acender / apagar) via Shell Script (comando de terminal) em uma classe Python. A cada acionamento do LED, o estado lógico do pino de GPIO será lido.
A BananaPi realizará login no Broker da HiveMQ Cloud e registro no tópico bananapi de mensagens, e enviará a notificação do estado lógico do pino, que foi consultado anteriormente.
Hive Web Client
Após o cadastro na plataforma HiveMQ, é necessário que seja configurada a credencial que será utilizada pela BananaPi e pelo Web Client, compondo usuário, senha e nível de acesso (publicação, assinatura ou publicação e assinatura).
Em seguida, é necessário fazer o login no Web Client utilizando a credencial cadastrada, e assinar o tópico bananapi. Uma vez conectada, todas as mensagens enviadas pela BananaPi serão lidas no Web Client.
Excalidraw — Exemplo do desacoplamento e do relacionamento dos componentes do MQTT — [04]
A imagem acima exemplifica o relacionamento entre os componentes do protocolo MQTT, destacando o desacoplamento entre eles.
Ou seja, o publicador não possui acesso ao(s) assinante(s) da(s) mensagem(ns) que são enviadas por ele ao mediador. Da mesma forma, o(s) assinante(s) também não tem acesso ao(s) publicador(es) da(s) mensagem(ns).
06. Circuito Eletrônico
Utilizaremos o pino de GPIO7 (pino físico 29) e o GND3 (pino físico 6), da mesma forma que foi demonstrado no artigo anterior:
Como piscar um LED utilizando BananaPi e Python via SSH
07. HiveMQ Cloud
Criação de conta
Para utilizar o serviço de Web Client da HiveMQ seguindo este artigo, é necessário criar uma conta gratuita. Clique aqui para o cadastro.
HiveMQ Cloud — Tela de Login — [15]
Cadastro de nova credencial de segurança
Para realizar a autenticação remota no Broker MQTT, no qual serão enviadas as mensagens da BananaPi, será necessário cadastrar uma credencial de segurança.
No cadastro de credencial de segurança, são necessários os seguintes campos:
- Username: Nome de usuário
- Password: Senha do usuário
- Permission: Tipo de permissão do protocolo MQTT
Na seleção do tipo de permissão, estão disponíveis as seguintes opções:
- Publish only: Apenas publicação
- Subscribe only: Apenas assinatura
- Publish and Subscribe: Publicação e Assinatura
Após isso, basta salvar a credencial de segurança, e ela estará disponível para utilização.
HiveMQ Cloud — Tela de configuração de credenciais para autenticação no Broker — [15]
Conexão Web Client
Para se conectar ao Web Client, basta inserir o nome de usuário e senha, conforme a credencial de segurança cadastrada na seção anterior.
Após se conectar, é necessário realizar a assinatura para receber as mensagens. Para fazer isso, são utilizados dois campos:
- Topic: É um canal de comunicação, semelhante a um filtro de mensagens
- QoS: Qualidade de Serviço, que define a garantia de entrega das mensagens, separada em três níveis
Os tópicos no protocolo MQTT são estruturados por hierarquia, assim como diretórios de arquivos. Por exemplo:
Os níveis de Qualidade de Serviço (QoS) são os seguintes:
- QoS 0 — Mensagem entregue no máximo uma vez (sem garantia)
- QoS 1 — Mensagem entregue pelo menos uma vez
- QoS 2 — Mensagem entregue exatamente uma vez
Existem detalhes técnicos sobre cada um dos níveis citados acima, mas não será necessário aprofundar nesse momento. Então para a demonstração deste artigo, vamos considerar apenas o tipo QoS 0.
HiveMQ Cloud — Tela do Web Client para assinatura de tópicos de mensagens — [15]
08. Algoritmo
Do ponto de vista do publicador (BananaPi), o algoritmo será composto pelas seguintes etapas:
Login:
Estabelecer conexão remota via SSH entre o computador e BananaPiComando Shell:
Executar o arquivo BlinkPublishMQTT via terminal do Linux na BananaPiBlinkPublishMQTT :
Iniciar a conexão remota com o BrokerBlinkPublishMQTT:
Enviar mensagem para o Broker sinalizando realização do loginBlinkPublishMQTT:
Configurar o pino GPIO7 da BananaPi para saídaBlinkPublishMQTT:
Imprimir a pergunta no terminal do Linux para ligar ou desligar o LEDBlinkPublishMQTT:
Escrever o estado lógico do pino de GPIO7, escolhido pelo usuárioBlinkPublishMQTT:
Ler o estado lógico do pino de GPIO7BlinkPublishMQTT:
Enviar mensagem para o Broker notificando o estado lógico atual do pino de GPIO7BlinkPublishMQTT:
Deportar o pino de GPIO7 da BananaPiBlinkPublishMQTT:
Enviar mensagem para o Broker sinalizando a realização do logout
09. Código em Python
Configuração de credenciais — Arquivo .env
Para executar o código a seguir, é necessário criar o arquivo .env para armazenar as seguintes 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 de segurança são necessárias para a autenticação no Broker e o envio das mensagens posteriormente.
Confira abaixo um exemplo do arquivo .env:
Confira abaixo as duas telas com as informações necessárias para armazenar as credenciais de segurança no arquivo .env:
HiveMQ Cloud — Tela de configurações dos acessos para obter ou cadastrar novas credenciais — [15]
HiveMQ Cloud — Tela principal do Cluster para obter a URL do Broker — [15]
Uma vez que temos toda as etapas de configurações realizadas, tanto no ambiente local (na BananaPi) quanto no remoto (HiveMQ), podemos prosseguir para o desenvolvimento do código.
Implementação da classe BlinkPublishMQTT.py
Aviso:
A classe BlinkPublishMQTT foi implementada considerando que será executada apenas em ambiente Linux, como a BananaPi.
Por isso, se for executada em outros ambientes (Windows ou macOS), não funcionará.
Enviando o arquivo via SSH do computador para a BananaPi
Para executar esse projeto, é necessário enviar os seguintes dois arquivos:
- Arquivo BlinkPublishMQTT.py
- Arquivo .env com as credenciais de segurança
Para fazer isso, basta enviar os dois comandos Shell abaixo no terminal. A senha configurada na BananaPi será requisitada:
$ scp /Users/henriqueotogami/bananapi/python/.env
pi@bananapi-zero.local:otogamidev/
$ scp /Users/henriqueotogami/bananapi/python/BlinkPublishMQTT.py
pi@bananapi-zero.local:otogamidev/
Login via SSH na BananaPi
Para acessar a BananaPi, é necessário fazer a autenticação via SSH, utilizando a senha configurada, que será requisitada após o envio do comando abaixo:
$ ssh pi@bananapi-zero.local
Imagem do Terminal após realizar a autenticação via SSH na BananaPi
Verificar a existência do arquivo BlinkPublishMQTT.py na BananaPi
Enviamos o arquivo com o código em Python, mas não verificamos a existência dele internamente na BananaPi, para ter certeza que foi enviado corretamente, antes de preparar o ambiente.
Então basta enviar os dois comandos abaixo, para navegar até o diretório local do projeto e depois listar todos os arquivos presentes nessa pasta:
$ cd ~/otogamidev/
$ ls -la
Instalação da biblioteca python-dotenv na BananaPi
Para carregar as credenciais de segurança presentes no arquivo .env, é necessário utilizar essa biblioteca python-dotenv, utilizando o comando abaixo:
$ pip3 install python-dotenv
Instalação da biblioteca pyenv na BananaPi
Essa biblioteca é utilizada devido a versão do Python global da BananaPi não ser atualizada para uma versão mais recente que o Python 3.5.
A biblioteca paho-mqtt implementa o protocolo MQTT, que será mostrada mais a frente, utiliza versões do Python maiores que a versão 3.7, por isso estaremos utilizamos a versão 3.9 em um ambiente isolado.
$ curl -fsSL https://pyenv.run | bash
Após enviar o comando acima, é necessário configurar as variáveis de ambiente do Linux e baixar pacotes de bibliotecas de desenvolvimento, para que a BananaPi consiga isolar a versão que utilizaremos:
Os comandos para alterar as variáveis do Linux e para baixar os pacotes de bibliotecas de ambiente de desenvolvimento foram encontrados em dois sites:
- Documentação oficial da biblioteca pyenv
- Pergunta no StackOverflow devido o Linux indicar que faltavam componentes SSL para utilizar o pyenv
Instalação biblioteca paho-mqtt na BananaPi
Essa biblioteca implementa o protocolo MQTT no Python, permitindo realizar as etapas de conexão, publicação de mensagens e assinatura no Broker, que serão utilizadas no arquivo BlinkPublishMQTT.py.
$ pip3 install paho-mqtt
Execução do arquivo BlinkPublishMQTT.py
Anteriormente, configuramos o ambiente local da BananaPi para utilizar a versão do Python 3.9, mas não é necessário especificar detalhadamente no momento da execução do arquivo com o código, basta enviar o comando abaixo:
$ python3 BlinkPublishMQTT.py
Após enviar o comando acima, o código em Python será executado conforme o exemplo abaixo:
Exemplo de execução do código em Python no terminal
Durante a execução do código acima no terminal do Linux, as notificações de mudança de estado lógico do LED são enviadas ao Broker conforme a imagem abaixo.
Além disso, implementamos a consulta de horário atual no código em Python para ser anexada em cada mensagem, permitindo a identificação do momento em que as mensagens foram enviadas para o Broker.
HiveMQ Cloud — Exemplo de notificação de mudanças de estado lógico do LED da BananaPi no Broker — [15]
10. Conclusão
O desenvolvimento do projeto demonstrado nesse artigo é relativamente simples, mas proporcionou o entendimento das seguintes tecnologias:
- Gerenciamento de pinos de GPIO do hardware da BananaPi
- Leitura e escrita em arquivos no Linux via comandos Shell
- Acesso e controle remoto da BananaPi via SSH
- Criação de ambiente isolado com versão específica do Python
- Utilização de implementação do MQTT em Python
- Utilização de arquivo com credenciais de segurança em Python
- Arquitetura do Protocolo MQTT
- Integração entre a BananaPi, Broker AWS e o Web Client HiveMQ
Dentre todo o conhecimento obtido através desse artigo, alguns pontos serão comentados mais detalhadamente a seguir:
Substituição do os.system() pelo subprocess.run()
Durante o desenvolvimento do código em Python, são utilizados comandos Shell para gerenciar o pino de GPIO para acender ou apagar o LED.
Inicialmente foi utilizado a função os.system(), mas a implementação dessa função cria um subshell , não fornece o controle sobre a saída e tratamentos de erros.
Exemplo:
- Arquivo exemploLeituraGPIO7.py
import os
os.system("sudo echo 7 > /sys/class/gpio/export")
os.system('sudo echo out > /sys/class/gpio/gpio7/direction')
Principalmente nos casos mostrados acima, em que o comando sudo fornece os privilégios de administrador somente para o echo, mas não repassa para o operador ">", ocasionando em falha que será mostrada a seguir.
- Execução exemploLeituraGPIO7.py
$ python3 exemploLeituraGPIO7.py
Execução do código exemploLeituraGPIO7.py no terminal com a falha de permissão
Mensagem de erro:
sh: 1: cannot create /sys/class/gpio/gpio7/direction: Permission denied
Para solucionar esse problema, utilizamos a função subprocess.run(), que permite controle de saída e impede a injeção de comandos, além de parecer mais estável durante os testes.
import subprocess
subprocess.run("sudo echo 7 > tmp", shell = True, check=True)
subprocess.run("sudo cp tmp /sys/class/gpio/export", shell = True, check=True)
subprocess.run("sudo echo out > tmp", shell = True, check=True)
subprocess.run("sudo cp tmp /sys/class/gpio/gpio7/direction", shell = True, check=True)
Um problema semelhante de falha na exportação de pinos de GPIO foi tratado no fórum da Raspberry Pi:
Execução do código exemploLeituraGPIO7.py no terminal com sucesso
Desacoplamento da arquitetura do protocolo MQTT
Diferentemente de uma arquitetura cliente — servidor tradicional, o protocolo MQTT funciona de uma forma bem mais simples e distribuída. Isso se deve ao fato que as mensagens publicadas são recebidas pelo Broker e repassadas para os assinantes, então não existe tratamento de dados, apenas encaminhamento.
Então, observando o protocolo como um todo, ele vai servir como um intermediário, considerando que os assinantes podem ser servidores para persistir os dados recebidos do Broker.
Essa característica reduz a necessidade de que dispositivos IoT em campo, como microcontroladores, implementem protocolos complexos para estabelecer uma comunicação segura. Em vez disso, a segurança pode ser delegada ao Broker, que gerencia autenticação e criptografia quando necessário.
Isso também impacta na redução de exigência de hardware, permitindo que equipamentos IoT que utilizam o MQTT possuam um valor mais acessível ao mercado.
11. Referências
- AWS — Protocolo MQTT
- BananaPi — BPI-M2 Zero — Especificação Técnica
- BananaPi — BPI-M2 Zero — Documentação
- Excalidraw — Visão Panorâmica do Projeto
- Excalidraw — Visão Panorâmica do Protocolo MQTT
- Fórum — Raspberry Pi — Falha na Exportação de GPIO
- Fórum — StackOverflow — Falha de Extensão do SSL
- Fritzing — Circuito Eletrônico
- Gist — Exemplo de hierarquia de Tópicos MQTT
- Gist — Arquivo .env com credenciais de segurança
- Gist — Arquivo BlinkPublishMQTT.py
- Gist — Arquivo de configuração de variáveis de ambiente Linux
- Github — Repositório da BananaPi
- HiveMQ — Protocolo MQTT
- HiveMQ Cloud — Cluster — Web Client
- HiveMQ Cloud — Documentação
- Python — Biblioteca python-dotenv
- Python — Biblioteca pyenv
- Python — Biblioteca paho-mqtt
Ficou alguma dúvida ou tem sugestões?
Comente aqui embaixo ou me chame em alguma das minhas redes.
Valeu! ✌