Este artigo mostrará como instalar e utilizar o MQTT e Python na Raspberry Pi 3, sendo assim um dos caminhos para se fazer projetos IoT nesta plataforma.
Pré-requisitos
Para reproduzir o conteúdo deste artigo, os seguintes pré-requisitos são necessários:
- Possuir uma Raspberry Pi 3 com uma distribuição Linux instalada*;
- A Raspberry Pi 3 deve ter acesso à Internet (Wi-Fi ou cabeada);
- Ter noções básicas de MQTT;
- Ter noções básicas de programação em Python.
*Este experimento foi feito e testado somente na distribuição Raspbian, porém não vejo razão para não funcionar nas demais.
Por que usar MQTT na Raspberry Pi 3?
O MQTT (Message Queue Telemetry Transport) é um leve e eficiente protocolo voltado para IoT. Possui header extremamente compacto e exige pouquíssimos recursos de hardware, processamento e baixíssima banda para funcionar. Como é calcado no TCP, possui também portanto garantia de entrega das mensagens (algo essencial em IoT).
Além disso, utilizando-se de um servidor (broker) na nuvem, a comunicação torna-se a nível global. Ou seja, é possível interagir via MQTT com a Raspberry Pi 3 de qualquer lugar do planeta que possua acesso à Internet.
Outro ponto interessante é que este protocolo possui implementações nos mais diversos sistemas operacionais, permitindo assim que dispositivos totalmente diferentes “conversem” pela Internet.
Broker utilizado
Há muitos brokers disponíveis na Internet (tanto grátis quanto pagos). Neste exemplo, utilizaremos o broker oficial do Eclipse (iot.eclipse.org), pois consiste de um broker grátis e com baixo downtime.
Preparação
Antes de codificar o experimento / projeto, primeiro é necessário baixar o Paho-MQTT. O Paho-MQTT trata-se do cliente MQTT oficial, sendo este disponível para as mais diversas linguagens (incluindo Python).
Para tal, primeiramente abra o terminal/console na Raspberry Pi 3. Uma vez aberto, clone o repositório do Paho-MQTT para Python utilizando o seguinte comando:
git clone https://github.com/eclipse/paho.mqtt.python
Este processo pode demorar alguns minutos, dependendo da velocidade de sua conexão com a Internet. Uma vez clonado o repositório, deve-se entrar na pasta com o conteúdo do mesmo e instalar o Paho-MQTT para Python. Para tal, utilize os seguintes comandos:
cd paho.mqtt.python python setup.py install
Após a instalação, está tudo pronto para se começar a desenvolver aplicações em Python que utilizem MQTT.
Mãos à obra!
O projeto / experimento consistirá de uma aplicação Python capaz de escrever na tela todas as mensagens recebidas pelo broker em um determinado tópico. É chegada a hora de fazer código! Para isto, salve o seguinte código como MQTT.py em alguma pasta conhecida:
import paho.mqtt.client as mqtt
import sys
#definicoes:
Broker = "iot.eclipse.org"
PortaBroker = 1883
KeepAliveBroker = 60
TopicoSubscribe = "PAHOMQTTRaspPi3" #dica: troque o nome do topico por algo "unico",
#Dessa maneira, ninguem ira saber seu topico de
#subscribe e interferir em seus testes
#Callback - conexao ao broker realizada
def on_connect(client, userdata, flags, rc):
print("[STATUS] Conectado ao Broker. Resultado de conexao: "+str(rc))
#faz subscribe automatico no topico
client.subscribe(TopicoSubscribe)
#Callback - mensagem recebida do broker
def on_message(client, userdata, msg):
MensagemRecebida = str(msg.payload)
print("[MSG RECEBIDA] Topico: "+msg.topic+" / Mensagem: "+MensagemRecebida)
#programa principal:
try:
print("[STATUS] Inicializando MQTT...")
#inicializa MQTT:
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker, PortaBroker, KeepAliveBroker)
client.loop_forever()
except KeyboardInterrupt:
print "\nCtrl+C pressionado, encerrando aplicacao e saindo..."
sys.exit(0)
Para executar no terminal, vá a pasta onde o arquivo MQTT.py está salvo e utilize o seguinte comando:
python MQTT.py
A aplicação será iniciada e todas as mensagens recebidas no tópico PAHOMQTTRaspPi3 irão aparecer na tela.
Para testar, utilize qualquer cliente MQTT (como, por exemplo, o MQTTLens para PC ou o MyMQTT para Android) em qualquer sistema operacional, conecte-se ao broker iot.eclipse.org e publique no tópico PAHOMQTTRaspPi3 uma mensagem qualquer. A mensagem irá aparecer na tela do terminal da Raspberry Pi 3!
Para sair da aplicação, pressione Ctrl + C.
Saiba mais
- Enviando temperatura dos núcleos da Raspberry Pi 3 para o ThingSpeak em C
- MQTT – Protocolos para IoT
- Modelos de comunicação para IoT
Referências









Teria como fazer o oposto? Ao invés de ler o que esta no Eclipse IoT, gravar algo que tenha sido lido por uma programação na Raspberry?
Sim, sem problemas. Leia sobre Publish e Subscribe em MQTT, isso vai te ajudar a fazer a comunicação “de duas vias”
nessa parte
{ #definicoes:
Broker = “iot.eclipse.org”
PortaBroker = 1883
KeepAliveBroker = 60
TopicoSubscribe = “PAHOMQTTRaspPi3” }
para adicionar Login e Senha.
Utilizo Mosquitto em outra Raspberry como broker, com login e senha,
onde coloco esses dados?
Tenho algumas dúvidas e se você pudesse me ajudar seria excelente pra mim. Vamos lá: Como faço pra enviar mensagens pelo raspberry para ver pelo MQTTLens? No meu projeto estou controlando um sensor pela rasp, preciso enviar um sinal pra ele medir e depois enviar essas medições por mqtt pra nuvem. Teria algum servidor que hospede esses meus dados na nuvem para ficarem salvos?
Muito bom. Usei o Mosquitto na minha rasp e só troquei os dados do Broker. Rodou de primeira. Valeu pelo excelente tutorial.
Obrigado!
como processar esse dado recebido do tópico e enviar para outro tópico?
Para processar, basta colocar o que deseja fazer com o dado na função on_message.
Para enviar para outro tópico, utilize a função client.publish. Para mais informações, acesse: https://www.steves-internet-guide.com/publishing-messages-mqtt-client/
Excelente,
Muito obrigado!
Quando rodei o arquivo, aconteceu esse erro. Como resolver ?
File “client_mqtt.py”, line 38, in
client = mqtt.Client()
AttributeError: ‘module’ object has no attribute ‘Client’
Algo parece ter dado errado na instalação da biblioteca MQTT (paho.mqtt.Python). Sugiro que refaça a instalação.
Muito bom o texto Pedro! Gostaria de saber se a partir desse protocolo, eu consigo enviar dados de um sensor e processá-los em nuvem. Se sim, qual servidor seria melhor para isso?
Sim, consegue. Quanto ao servidor, depende muito do que deseja fazer, custo, etc.
Excelente guia! Simples, direto e eficiente. Valuezão!
Obrigado!