Вы находитесь на странице: 1из 9

2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

MQTT - Protocolos para IoT


Por Marcelo Barros - 15/06/2015

NDICE DE CONTEDO [MOSTRAR]

Febre. Moda. Hype. Qualquer uma das trs palavras descreve bem o cenrio do
conjunto de tecnologias conhecida como Internet das Coisas (IoT, do ingls, Internet of
Things). Uma profuso de plataformas em nvem, sensores, hardware diversos e
mdulos vm aparecendo, gerados pelos mais diversos fabricantes. Intel , Microsoft
, Samsung , ARM , Google, IBM, Apple, s para citar algumas gigantes, tm hoje
setores devotados a criar solues para IoT. Com este panorama, ainda difcil dizer
quais sero os lderes de mercado dos prximos anos em IoT, se que teremos algum.

Na rea de protocolos no diferente: inmeras propostas e implementaes j


existem. Leves mudanas de escopo, algumas pequenas diferenas de casos de uso j
so sucientes para que a companhia proponha o seu novo protocolo para IoT.

Um dos protocolos de troca de mensagens para IoT em uso recente o MQTT


(Message Queue Telemetry Transport). Criado pela IBM Gostou?
no nal da dcada
Junte-se de 90,
comunidade
a
obviamente210o protocolo
3 d f k
carrega2 muito do360cenrio de uso original, maisEmbarcados
voltado e
https://www.embarcados.com.br/mqttprotocolosparaiot/ 1/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

adaptado para sistemas de superviso e coleta de dados do tipo SCADA (Supervisory


Control and Data Acquisition ou Sistemas de Superviso e Aquisio de Dados, em
portugus). Mas, mesmo assim, o MQTT encontrou seu espao nesse amplo mercado
de IoT.

O MQTT no to sosticado quanto o AMQP (Advanced Message Queuing


Protocol), que possui mais funcionalidades e cenrios de uso, mas simples o
suciente sem deixar de contemplar caractersticas como segurana, qualidade de
servio e facilidade de implementao. Essas caractersticas fazem do MQTT um bom
candidato para implementaes e usos em sistemas embarcados, embora a
competio seja acirrada.

Neste artigo discutiremos um pouco sobre o MQTT, explicando o seu funcionamento e


aplicaes.

Publish/Subscriber do MQTT e tpicos


O padro de troca de mensagens no MQTT o publish/subscriber


(publicador/subscritor). Neste padro, quando um elemento da rede deseja receber
uma determinada informao, ele a subscreve, fazendo uma requisio para um outro
elemento da rede capaz de gerir as publicaes e subscries. Na rede MQTT este
elemento conhecido como broker, o intermedirio no processo de comunicao.
Elementos que desejam publicar informaes o fazem tambm atravs do broker,
enviando-lhe as informaes que possuem. Esse padro no novo e existe em outros
protocolos. Por exemplo, a troca de informao de controle (links) em redes
Foundation Fieldbus segue o paradigma publish/subscriber.


Gostou? Junte-se comunidade
a 210 d 3 f 2 k 360 Embarcados

https://www.embarcados.com.br/mqttprotocolosparaiot/ 2/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

Apesar de o broker representar um elo de fragilidade na rede ao centralizar as


comunicaes, ele permite um desacoplamento entre as partes comunicantes, algo
no possvel em modelos de comunicao do tipo cliente/servidor. Vale lembrar que
existem solues de brokers redundantes ou operando em clusters, na tentativa de
mitigar esta fragilidade.

Figura1MQTToverview

A identicao das mensagens no MQTT se d atravs de tpicos (topics). O tpico


lembra o conceito de URI, com nveis separados por barras (/). Elementos da rede
podem enviar diversos tpicos para o broker e subscritores podem escolher os tpicos
que desejam subscrever.

Por exemplo, imagine que, em uma rede de sensores, existam vrios sensores
diferentes de temperatura e umidade, publicando o valor do sensor como o dado til
(payload) e identicando as mensagens com tpicos nos seguintes formatos:

1 area/ID_da_area/sensor/ID_do_sensor/temperatura
2 area/ID_da_area/sensor/ID_do_sensor/umidade


Gostou? Junte-se comunidade
a 210 d 3 f 2 k 360 Embarcados

https://www.embarcados.com.br/mqttprotocolosparaiot/ 3/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

Neste esquema, possveis publicaes seriam:

1 area/10/sensor/5000/temperatura
2 area/10/sensor/5000/umidade
3 area/10/sensor/5001/temperatura
4 area/10/sensor/5001/umidade
5 area/20/sensor/4000/temperatura
6 area/20/sensor/4000/umidade
7 area/20/sensor/4001/temperatura
8 area/20/sensor/4001/umidade

Ou seja, temos informaes provenientes de duas reas diferentes (10 e 20) sendo
geradas por quatro sensores (5000, 5001, 4000, 4001), onde cada sensor publica
temperatura e umidade. O valor da temperatura ou umidade faz parte dos dados da
mensagem, sendo o formato algo dependente da aplicao, uma vez que o MQTT no
impe restries sobre isso. Seria possvel codicar a mensagem em json, ou mesmo
enviar um valor binrio de 16 bits para cada varivel, entre outras formas.

Um subscritor pode assinar estas mensagens, especicando exatamente o tpico que


deseja. No entanto, muito mais interessante receber informaes agrupadas. Por
exemplo, para assinar todas as informaes de sensores de temperatura da rea 10, o
seguinte tpico poderia ser usado:

1 area/10/sensor/+/temperatura

O + tem funo de curinga, aceitando qualquer valor naquele nvel do tpico. Existe
tambm uma outra notao utilizando o smbolo #, que signica qualquer coisa
abaixo de determinado nvel do tpico. Assim, para ter acesso a qualquer valor de
sensoriamento dentro da rea 20, o tpico seria:

1 area/20/sensor/#
Gostou? Junte-se comunidade

a 210 d 3 f 2 k 360 Embarcados

https://www.embarcados.com.br/mqttprotocolosparaiot/ 4/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

Independente do sensor e da varivel sensoriada, tudo seria recebido.

Tpicos que comeam com $ so considerados especiais, sendo geralmente


reservados para uso interno do broker. Para o broker Mosquitto , a quantidade de
clientes ativos dada pelo seguinte tpico:

1 $SYS/broker/clients/total

Conexo, segurana e qualidade de servio


A conexo do cliente ao broker, seja ele subscritor ou publicador, originalmente feita


via TCP, com opes de login (usurio e senha) e uso de criptograa (SSL/TLS).
possvel encontrar tambm outros meios fsicos, com MQTT rodando em links seriais,
por exemplo.

Todo processo de conexo estabelece tambm um nvel de qualidade de servio (QoS,


de Quality of Service) desejado, indicando como deve ser a relao entre os elementos
comunicantes. So previstos trs nveis de qualidade de servio:

Gostou? Junte-se comunidade


a 210 d 3 f 2 k 360 Embarcados

https://www.embarcados.com.br/mqttprotocolosparaiot/ 5/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

QoS 0 (at most once): o que conhecemos como best effort, ou melhor esforo.
Assemelha-se ao protocolo de transporte UDP, onde no se tem conrmaes de
entrega de mensagem. Quem envia tambm no tem a obrigao de manter a
mensagem armazenada para futuras retransmisses;
QoS 1 (at least once): Neste nvel existe a conrmao de entrega de uma
mensagem. Atende situaes onde quem envia acaba gerando vrias mensagens
iguais possivelmente por um atraso na chegada de conrmao de recebimento.
Neste caso, garantido que uma delas ter o reconhecimento realizado. Note que
existe um armazenamento da mensagem por parte de quem envia at a posterior
conrmao;
QoS 2 (exactly once): Garante que a mensagem seja entregue exatamente uma vez,
com envio de conrmaes de recebimento e conrmaes de recebimento de
conrmaes de recebimento (!). Parece confuso, mas no , apenas existem
conrmaes nos dois sentidos, para tudo que trafegado. Enquanto uma
mensagem no conrmada, ela mantida. um caso mais prximo do protocolo
de transporte TCP.

No existe um QoS melhor ou pior, isto ir depender de cada cenrio de aplicao do


MQTT, da qualidade do link de comunicao, dos recursos disponveis no seu sensor,
etc. E, importante ressaltar, cada nvel de QoS negociado entre o cliente e o broker,
no entre o publicador e o subscritor. Assim, possvel ter uma publicao em QoS 0 e
uma subscrio em QoS 2, para um mesmo tpico.

Implementaes e exemplos de uso


Existem diversas implementaes para clientes e brokers MQTT, open source ou no, e
para diversas linguagens como Java, C, C#, Javascript e Python. Como exemplo, ser
usado o broker open sourceMosquitto , que pode ser facilmente baixado e instalado
para diversos sistemas operacionais e plataformas (Windows, MAC, Linux, Raspberry
Pi, OpenWRT, etc). Adicionalmente, para a parte de criptograa do Mosquitto, existe a
Gostou? Junte-se comunidade
a
necessidade210de instalao
3 d
do pacote
2 openssl.
360f k Embarcados

https://www.embarcados.com.br/mqttprotocolosparaiot/ 6/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

No Windows, uma vez que o broker esteja instalado, para um caso simples de uso sem
senhas, bastaria execut-lo. O broker usa a porta 1883 e TCP (isto pode ser alterado via
arquivo de congurao).

Escrever um cliente em python talvez seja a forma mais fcil de testar o MQTT. Para
um sistema com python j instalado, o mdulo MQTT proveniente do projeto paho
pode ser adicionado via pip com o seguinte comando:

1 pip install paho-mqtt

Obs: Para instalar o pip num host Ubuntu ou Windows, execute os seguintes
comandos:

1 Ubuntu: apt-get install python-pip


2 Windows: C:\python27\Scripts\pip install paho-mqtt

Utilizando os tpicos de temperatura e umidade mencionado antes, podemos criar um


pequeno script capaz de se comportar como um sensor dentro da rea 10, enviando
valores de temperatura e umidade a cada 5 segundos e com um QoS de nvel 0.

1 # -*- coding: cp1252 -*-


2 import paho.mqtt.client as mqtt
3 from struct import pack
4 from random import randint
5 from time import sleep
6
7 AREA_ID = 10
8 SENSOR_ID = 5000
9
10 # topicos providos por este sensor
11 tt = "area/%d/sensor/%s/temperatura" % (AREA_ID,SENSOR_ID)
Gostou? Junte-se comunidade
a d f k
12 ut = "area/%d/sensor/%s/umidade" % (AREA_ID,SENSOR_ID)
13 210 3 2 360 Embarcados
14 # cria um identificador baseado no id do sensor

https://www.embarcados.com.br/mqttprotocolosparaiot/ 7/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

15 client = mqtt.Client(client_id = 'NODE:%d-%d' % (AREA_ID,SENSOR_ID),


16 protocol = mqtt.MQTTv31)
17 # conecta no broker
18 client.connect("127.0.0.1", 1883)
19
20 while True:
21 # gera um valor de temperartura aleatrio
22 t = randint(0,50)
23 # codificando o payload como big endian, 2 bytes
24 payload = pack(">H",t)
25 # envia a publicao
26 client.publish(tt,payload,qos=0)
27 print tt + "/" + str(t)
28
29 # gera um valor de umidade aleatrio
30 u = randint(0,100)
31 # codificando o payload como big endian, 2 bytes
32 payload = pack(">H",u)
33 # envia a publicao
34 client.publish(ut,payload,qos=0)
35 print ut + "/" + str(u)
36
37 sleep(5)

Neste publicador, preferiu-se o QoS 0 e os possveis erros de conexo no foram


tratados para que o exemplo no casse mais complexo. Nos outros nveis de
qualidade de servio necessrio a chamada de outras funes que avaliam o
recebimento de conrmaes e gerenciam retransmisses.

Note que os dados foram organizados como inteiros de 16 bits no formato big endian,
ou seja, o valor mais signicativo vem no payload. A funo pack e seu argumento >H
faz esta codicao (> para big endian e H para inteiro sem sinal de 16 bits).
Posteriormente, este valor ser decodicado com a funo unpack. Para maiores
informaes, consultar o mdulo struct da linguagem.

Criar um subscritor capaz de receber todas as mensagens da rea 10, por sua vez,
pode ser implementado como a seguir:

1 # -*- coding: cp1252 -*-


2 import paho.mqtt.client as mqtt
3 from struct import unpack
4 from time import sleep
5 Gostou? Junte-se comunidade
6
7
a
# assinando
d f
210 todas as 3publicaes 2dentro da area
TOPIC = "area/10/sensor/#"
360 10 k Embarcados

https://www.embarcados.com.br/mqttprotocolosparaiot/ 8/9
2017830 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados

8
9 # funo chamada quando a conexo for realizada, sendo
10 # ento realizada a subscrio
11 def on_connect(client, data, rc):
12 client.subscribe([(TOPIC,0)])
13
14 # funo chamada quando uma nova mensagem do tpico gerada
15 def on_message(client, userdata, msg):
16 # decodificando o valor recebido
17 v = unpack(">H",msg.payload)[0]
18 print msg.topic + "/" + str(v)
19
20 # clia um cliente para supervis0
21 client = mqtt.Client(client_id = 'SCADA',
22 protocol = mqtt.MQTTv31)
23 # estabelece as fune de conexo e mensagens
24 client.on_connect = on_connect
25 client.on_message = on_message
26
27 # conecta no broker
28 client.connect("127.0.0.1", 1883)
29
30 # permace em loop, recebendo mensagens
31 client.loop_forever()

Todas as mensagens que chegam e casam com o tpico assinado acabam sendo
tratadas pelo mtodo on_message. possvel criar funes diferentes de recepo,
separando a recepo dos tpicos. A subscrio dos tpicos deve ser feita aps a
conexo, algo tratado pela funo on_connect. Por m, via uma chamada
loop_forever() do mdulo MQTT do paho, o subscritor ca indenidamente recebendo
as mensagens do tpico assinado. Os dois scripts devem rodar sem modicaes
tanto num PC quanto numa Beaglebone ou Raspberry Pi . Recomenda-se um
estudo no mdulo MQTT do paho, explorando as demais funcionalidades providas por
ele.

Existe muito mais a ser explorado do MQTT, como mensagens de testamento,


manuteno da conexo com keep alives, sesses persistentes e outros nveis de QoS.
Voltaremos nesses tpicos em um artigo posterior. At l!

MQTT - Protocolos para IoT por Marcelo Barros . Esta obra est licenciado com uma
Licena Creative Commons Atribuio-CompartilhaIgual 4.0 Internacional .

Gostou? Junte-se comunidade


a 210 d 3 f 2 k 360
Marcelo Barros
Embarcados

https://www.embarcados.com.br/mqttprotocolosparaiot/ 9/9

Вам также может понравиться