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)

Mar 16, 2025 - 20:12
 0
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

  1. Requisitos
  2. O que é o protocolo MQTT ?
  3. O que é o HiveMQ ?
  4. O que é a BananaPi ?
  5. Visão panorâmica do projeto
  6. Circuito Eletrônico
  7. HiveMQ Cloud
  8. Algoritmo
  9. Código em Python
  10. Conclusão
  11. 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:

  1. Publicador (Publisher): Dispositivo ou aplicação que envia mensagens para um tópico específico.

  2. Mediador (Broker): Recebe as mensagens publicadas e distribui para os dispositivos que estão inscritos nesse tópico.

  3. 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

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]

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

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

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

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

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

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:

  1. Login:
    Estabelecer conexão remota via SSH entre o computador e 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 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 de GPIO7, escolhido pelo usuário

  8. BlinkPublishMQTT:
    Ler o estado lógico do pino de GPIO7

  9. BlinkPublishMQTT:
    Enviar mensagem para o Broker notificando o estado lógico atual do pino de GPIO7

  10. BlinkPublishMQTT:
    Deportar o pino de GPIO7 da BananaPi

  11. BlinkPublishMQTT:
    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

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

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

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:

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

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

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

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:

Image description

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

  1. AWS — Protocolo MQTT
  2. BananaPi — BPI-M2 Zero — Especificação Técnica
  3. BananaPi — BPI-M2 Zero — Documentação
  4. Excalidraw — Visão Panorâmica do Projeto
  5. Excalidraw — Visão Panorâmica do Protocolo MQTT
  6. Fórum — Raspberry Pi — Falha na Exportação de GPIO
  7. Fórum — StackOverflow — Falha de Extensão do SSL
  8. Fritzing — Circuito Eletrônico
  9. Gist — Exemplo de hierarquia de Tópicos MQTT
  10. Gist — Arquivo .env com credenciais de segurança
  11. Gist — Arquivo BlinkPublishMQTT.py
  12. Gist — Arquivo de configuração de variáveis de ambiente Linux
  13. Github — Repositório da BananaPi
  14. HiveMQ — Protocolo MQTT
  15. HiveMQ Cloud — Cluster — Web Client
  16. HiveMQ Cloud — Documentação
  17. Python — Biblioteca python-dotenv
  18. Python — Biblioteca pyenv
  19. Python — Biblioteca paho-mqtt

Ficou alguma dúvida ou tem sugestões?
Comente aqui embaixo ou me chame em alguma das minhas redes.
Valeu! ✌