A Raspberry PI se consolidou no mercado maker como linha de placas para desenvolvimento. Com enorme popularidade, sua inserção em projetos de Internet das Coisas foi natural, sendo uma das placas mais procuradas para prototipação e testes de projetos IoT atualmente. No mundo da Internet das Coisas, uma série de tecnologias surgiram e outras já consolidadas foram integradas, criando-se assim uma verdadeira “salada” de tecnologias relevantes para quem trabalha no segmento. Dentre estas tecnologias, uma das mais usadas na atualidade é o MQTT, um protocolo de comunicação M2M (Machine-to-Machine) de simples concepção, leve em termos de poder computacional exigido e uso de Internet exigido e facilmente utilizável nas linguagens de programação mais requeridas no mercado. Nessa linha de raciocínio, este artigo mostrará como utilizar o protocolo MQTT na Raspberry PI, utilizando como linguagem de programação o Python.
Material necessário
Para reproduzir o exemplo deste artigo, você precisará de:
- Uma placa Raspberry PI (qualquer modelo, desde que possua conectividade com a Internet (cabeada ou sem fio).
- Uma fonte 5V / 2A (recomendado: 5V / 3A) micro-USB para a Raspberry Pi.
Por que usar MQTT?
O MQTT (Message Queue Telemetry Transport) é um protocolo de comunicação M2M leve e eficiente voltado para Internet das Coisas e dispositivos portáteis, principalmente onde consumo de Internet / banda, poder computacional e consumo energético são muito limitados.
Abaixo, estão elencadas as principais vantagens no uso do MQTT:
- Para se ter ideia do baixo consumo de banda, além do header das mensagens ser muito compacto (pode ser de apenas 5 bytes) o keep-alive e mensagem de desconexão possuem, segundo especificação do protocolo, apenas 2 bytes. Para dispositivos com consumo de Internet muito limitados, como àqueles que utilizam telefonia móvel (3G, 4G, etc.) por exemplo, isso é uma característica muito positiva.
- O MQTT utiliza TCP, logo possui também garantia de entrega das mensagens. Sobre isso, conta ainda mais dois modos de handshake, visando garantia total da entrega das mensagens, algo vital para alguns projetos de Internet das Coisas.
- Em termos de arquitetura, numa estrutura básica, como o MQTT é formado de N clientes e um broker (servidor MQTT), ou seja, com centralização da sincronia e gerenciamento do fluxo de dados no broker, os clientes ficam livres de qualquer processamento / tráfego de rede por boa parte de seu tempo de operação. Isso permite que estes dispositivos entrem em modos de baixo consumo de energia, tornando assim o MQTT um protocolo elegível para comunicação entre dispositivos Low Power, como dispositivos vestíveis (wearables) e dispositivos automotivos, por exemplo.
- Quando é utilizado um broker na nuvem, a comunicação MQTT torna-se global. Ou seja, é possível interagir com dispositivos que utilizem MQTT de qualquer lugar do planeta, desde que haja acesso à Internet.
- Por fim, o MQTT possui implementações nos mais diversos sistemas operacionais e biblioteca para várias das linguagens de programação mais utilizadas no mercado, permitindo assim que dispositivos totalmente diferentes "conversem" pela Internet através do MQTT.
Brokers MQTT
Há, de forma simplista, dois tipos de brokers disponíveis na Internet:
1. Brokers públicos: são brokers de acesso grátis, destinado a testes / prototipação de projetos. Uma lista de brokers MQTT públicos pode ser vista neste link .
2. Brokers privados / pagos: são brokers com acesso pago, muitas vezes dentro de plataformas IoT, geralmente destinados uso comercial / uso em projetos reais.
Neste exemplo, será utilizado o broker público iot.eclipse.org .
Instalação da biblioteca Paho-MQTT para Python
A biblioteca Paho MQTT trata-se de uma biblioteca open-source para desenvolvimento de clientes MQTT (e, mais recentemente, desenvolvimento de clientes MQTT-SN também). Esta biblioteca é um projeto mantido pela Eclipse Foundation e possui como principais características ser leve, suportar conexão MQTT segura (TLS/SSL) e por possuir versões para várias linguagens de programação usadas ativamente no mercado, tais como Java, C e Python.
Neste exemplo, vamos utilizar esta biblioteca para a linguagem de programação Python. Para instalá-la, siga o procedimento abaixo:
1. Acessando a Raspberry através de um terminal / console (remoto ou local), vá ao diretório home de seu usuário e baixe a biblioteca utilizando os comandos abaixo:
cd ~
git clone https://github.com/eclipse/paho.mqtt.python
2. Aguarde o download terminar. Isso pode levar alguns minutos, dependendo da velocidade de sua conexão à Internet.
Após o download, você deve entrar na pasta onde a biblioteca foi baixada e instalá-la na Raspberry PI. Faça isso utilizando os comandos abaixo:
cd paho.mqtt.python
python setup.py install
3. A instalação irá demorar alguns segundos. Finalizada a instalação, a biblioteca Paho-MQTT para Python estará pronta para uso.
Código-fonte do exemplo
É chegada do código-fonte! Copie o código-fonte e salve-o na Raspberry PI como exemplo_mqtt_python.py.
import paho.mqtt.client as mqtt import sys #definicoes do MQTT Broker = "iot.eclipse.org" #broker publico utilizado. porta_broker = 1883 #porta utilizada para comunicacao com o broker MQTT #utilize a porta 1883 para comunicacao com conexao nao segura keep_alive_broker = 60 #tempo (em segundos) do keep-alive topico_subscribe = "MQTTRaspPiINCB" #topico MQTT que o programa ira "ouvir" (fazer subscribe) #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.") #faz subscribe automatico no topico client.subscribe(topico_subscribe) #Callback - mensagem recebida do broker #toda vez que uma mensagem for recebida do broker, esta funcao sera chamada 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: #cria client MQTT e define funcoes de callback de conexao (client.on_connect) #e recepcao de dados recebidos (client.on_message) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message #faz a conexao ao broker MQTT client.connect(Broker, porta_broker, keep_alive_broker) #mantem o MQTT funcionando por tempo indeterminado, sendo que todas as #mensagens recebidas vao fazer a funcao de callback de dados recebidos #(on_message) ser chamada client.loop_forever() except KeyboardInterrupt: print "\nCtrl+C pressionado, encerrando aplicacao e saindo..." sys.exit(0)
Teste do programa
Uma vez salvo na Raspberry PI o código-fonte como exemplo_mqtt_python.py, execute-o com o comando abaixo:
python exemplo_mqtt_python.py
Após a mensagem informando que a conexão ao broker foi realizada aparecer, utilize qualquer cliente MQTT, como por exemplo o MQTTLens. No cliente MQTT de sua escolha, publique qualquer mensagem no tópico que o exemplo faz subscribe (no caso, utilizei o tópico MQTTRaspPiINCB) e observe a mensagem confirmando a recepção da mensagem no exemplo. Isso mostra que a Raspberry Pi está se comunicando corretamente via MQTT.
Para sair do exemplo, pressione Ctrl + C.
Conclusão
Neste artigo, vimos o que o MQTT é um protocolo utilizado em Internet das Coisas devido às suas vantagens relacionadas a versatilidade (bibliotecas presentes para várias linguagens de programação), baixo poder computacional exigido e possibilidade de uso em dispositivos portáteis e com restrição de bateria. Ainda, vimos como construir um exemplo de comunicação MQTT na Raspberry Pi utilizando a linguagem de programação Python.
Como as grandes plataformas IoT (dentre elas, Azure e AWS) permitem comunicação dos dispositivos por MQTT, nota-se saber utilizar este protocolo é, sem dúvidas, algo fundamental para aqueles que querem trabalhar com projetos de Internet das Coisas (IoT).