MQTT com Raspberry Pi, Python e Android
Sou um desenvolvedor, e há 3 meses adquiri um Raspberry Pi para tentar entrar no mundo de IoT. Na primeira semana fiquei um pouco perdido nesse novo mundo, mas depois de um tempo as coisas começaram a clarear.
Para o primeiro desafio, comprei um sensor de umidade e temperatura para o Raspberry. O objetivo era mostrar essas informações em um aplicativo Android.
Um amigo, André Queiroz, indicou o MQTT, para cuidar do envio de informações entre dispositivos de forma assíncrona. O que mais me chamou atenção foi a simplicidade de uso.
Características do MQTT:
- O MQTT (Message Queue Telemetry Transport), desenvolvido pela IBM para monitoramento via sensores de pipelines de petróleo a satélites.
- É um protocolo leve para redes com largura de banda limitada e alta latência.
- O transporte de mensagens via MQTT suporta comunicação assíncrona, perfeito para redes que não são confiáveis.
- Uso de Publish/Subscribe.
- Broker.
Broker
O broker recebe mensagens dos publishers num tópico específico, e envia para os subscribers que assinaram aquele tópico. Vamos usar um broker free da Eclipse Foundation: iot.eclipse.org, mas nada impede de usar outros ou até mesmo instalar um broker em servidor próprio.
Publisher
O publisher publica uma mensagem em um tópico específico.
Subscriber
O subscriber assina um tópico específico e quando um publisher publica alguma mensagem naquele tópico, o subscriber a recebe.
Desenvolvimento
Conforme falamos antes, para testar o funcionamento do MQTT, iremos usar o Raspberry com um sensor de temperatura e umidade. Usaremos Python para ler os dados desse sensor e enviaremos para um tópico: t0th/temperature e t0th/humidity. Num aplicativo Android assinar esses tópicos e mostrar esses dados numa tela simples.
Python
O nosso código Python rodará no Raspberry, para pegar a temperatura e umidade e enviar esses dados para os tópicos.
Instalando a biblioteca Paho MQTT
Paho MQTT é um um cliente MQTT feito em Python
# pip install paho-mqtt
Instalação das bibliotecas
Adafruit-DHT é um biblioteca usada para leitura do sensor de temperatura e umidade.
# pip install -r requirements.txt
Script que captura os dados dos sensores ligados ao Raspberry e publica nos tópicos.
Rodando o script.
# python start_mqtt.py
Pronto, estamos publicando a temperatura e a umidade nos tópico t0th/temperature e t0th/humidity respectivamente usando o broker iot.eclipse.org
Android
O nosso aplicativo Android terá uma tela simples escutando os tópicos de temperatura e umidade e mostrando na tela.
Vamos usar a biblioteca Paho da própria Eclipse: https://github.com/eclipse/paho.mqtt.android
Adicionando a biblioteca Paho MQTT
Cliente Android MQTT
Criamos uma classe cliente e adicionando alguns métodos que vamos usar.
Conectando e subscrevendo aos tópicos de temperatura e umidade
- Em nossa activity temos uma instância do cliente MQTT(MqttClient.kt) criado anteriormente.
- Usamos o método connect() dessa classe, passando um array dos 2 tópicos: t0th/temperature e t0th/humidity. Como segundo parâmetro, passamos uma função de callback chamada setData.
- No método connect() fazemos a assinatura(subscribe) dos tópicos passados e chamamos a callback passada quando uma mensagem chega no método messageArrived().