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.
so sucientes para que a companhia proponha o seu novo protocolo para IoT.
Diariamente
Semanalmente
https://www.embarcados.com.br/mqttprotocolosparaiot/ 2/9
2017820 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados
Figura1MQTToverview
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
Comquefrequnciavocvisitao
(payload) e identicando as mensagens com tpicosEmbarcados?
nos seguintes formatos:
Diariamente
Semanalmente
1 area/ID_da_area/sensor/ID_do_sensor/temperatura
2 area/ID_da_area/sensor/ID_do_sensor/umidade
Apenasquandopreciso
Gostou? Junte-se comunidade
a 210 d 3 f 2 k 360
NotusingHotjaryet? Enviar Embarcados
https://www.embarcados.com.br/mqttprotocolosparaiot/ 3/9
2017820 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados
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.
1 area/10/sensor/+/temperatura
O + tem funo de curinga, aceitando qualquer valor naquele nvel do tpico. Existe
Comquefrequnciavocvisitao
tambm uma outra notao utilizando o smbolo Embarcados?
#, 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:
Diariamente
Semanalmente
Apenasquandopreciso
1 area/20/sensor/#
Gostou? Junte-se comunidade
a 210 d 3 f 2 k 360
NotusingHotjaryet? Enviar Embarcados
https://www.embarcados.com.br/mqttprotocolosparaiot/ 4/9
2017820 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados
1 $SYS/broker/clients/total
Comquefrequnciavocvisitao
Embarcados?
Diariamente
Semanalmente
Apenasquandopreciso
https://www.embarcados.com.br/mqttprotocolosparaiot/ 5/9
2017820 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.
Existem diversas implementaes para clientes e brokers MQTT, open source ou no, e
Diariamente
para diversas linguagens como Java, C, C#, Javascript e Python. Como exemplo, ser
Semanalmente
usado o broker open sourceMosquitto , que pode ser facilmente baixado e instalado
para diversos sistemas operacionais e plataformas (Windows, MAC, Linux, Raspberry
Apenasquandopreciso
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.
f
360
NotusingHotjaryet?k Enviar Embarcados
https://www.embarcados.com.br/mqttprotocolosparaiot/ 6/9
2017820 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:
Obs: Para instalar o pip num host Ubuntu ou Windows, execute os seguintes
comandos:
Comquefrequnciavocvisitao
1 # -*- coding: cp1252 -*- Embarcados?
2 import paho.mqtt.client as mqtt
3 from struct import pack
4 from random import randint Diariamente
5 from time import sleep
6
7 AREA_ID = 10 Semanalmente
8 SENSOR_ID = 5000
9
10 # topicos providos por este sensor Apenasquandopreciso
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
NotusingHotjaryet? Enviar Embarcados
14 # cria um identificador baseado no id do sensor
https://www.embarcados.com.br/mqttprotocolosparaiot/ 7/9
2017820 MQTTPublish/SubscriberProtocolosparaIoTEmbarcados
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.
Diariamente
Semanalmente
1 # -*- coding: cp1252 -*-
2 import paho.mqtt.client as mqtt
3 from struct import unpack Apenasquandopreciso
4 from time import sleep
5 Gostou? Junte-se comunidade
6
7
a
# assinando
d f k
210 todas as 3publicaes 2dentro da NotusingHotjaryet?
TOPIC = "area/10/sensor/#"
area
360 10 Enviar Embarcados
https://www.embarcados.com.br/mqttprotocolosparaiot/ 8/9
2017820 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.
Diariamente
Semanalmente
MQTT - Protocolos para IoT por Marcelo Barros . Esta obra est licenciado com uma
Licena Creative Commons Atribuio-CompartilhaIgual 4.0 Internacional .
Apenasquandopreciso
https://www.embarcados.com.br/mqttprotocolosparaiot/ 9/9