Protocolo MQTT
Maurício Moreira Neto
Orientador: José Neuman de Souza
2
Mas primeiro, vamos revisar o conteúdo da aula
anterior...
Sumário
● O que é o protocolo MQTT?
● Vantagens
● Componentes do Modelo
● Segurança e Qualidade de Serviço
● Implementações e Exemplos
3
O que é o protocolo MQTT?
● Message Queue Telemetry Transport (MQTT) é um protocolo leve para
dispositivos de IoT e otimizado para rede TCP/IP, criada pela IBM no final dos
anos 90
● Utiliza o paradigma publish-subscribe
● Criado inicialmente para sistemas de supervisão e coleta de dados (SCADA)
4
O que é o protocolo MQTT?
Mas por que o MQTT se tornou um protocolo tão
utilizado para internet das coisas?
5
O que é o protocolo MQTT?
● Desenvolvido para hardware de dispositivo altamente restringido em
poder computacional e em redes de largura da banda limitada e de alta
latência
● Sistema de comunicação assíncrona
○ Desacopla emissor de receptor
● Prove distribuição de mensagens um-para-muitos, muitos-para-muitos e
desacoplamento de aplicações
● Apresenta 3 níveis de QoS
6
Por que não usar outros protocolos??
7
O que é o protocolo MQTT?
● Por que não usar o HTTP?
○ Síncrono
■ Cliente espera que o servidor responda
■ Alta latência
○ Unidirecional
■ Cliente precisa iniciar conexão
○ Um pra um
○ Pesado e cheio de regras
■ Não adequada para redes restritas
8
Vantagens do MQTT
● O protocolo oferece algumas vantagens como:
○ Leveza (mínimo de overhead) - Header de 2 bytes
○ Open Source
○ "Confiabilidade"
○ Simplicidade
9
Componentes do Modelo
● O MQTT é um protocolo que utiliza o paradigma pub-sub
● Neste paradigma tem-se três componentes principais:
○ Publishers - Elementos que publicam a mensagem em um tópico
○ Subscribers - Elementos que se inscrevem no tópico e recebem as
mensagens
○ Broker - Responsável pelo intermédio das trocas de mensagens
10
Componentes do Modelo
11Figura retirada de: https://www.slideshare.net/PaulaPea10/building-an-iot-app-using-mqtt
Componentes do Modelo
12Figura retirada de: http://programmingwithreason.com/article-mqtt-in-depth.html
Componentes do Modelo
13Figura retirada de: https://www.slideshare.net/PaulaPea10/building-an-iot-app-using-mqtt
Segurança e Qualidade de Serviço
● A conexão entre o cliente e o Broker é feita via TCP (com opções
login) e o uso de criptografia (SSL/TLS)
● O protocolo MQTT fornece 3 níveis de qualidade de serviço (QoS)
indicando como deve ser a relação entre os elementos
comunicantes
○ QoS 0 - at most once
○ QoS 1 - at least once
○ QoS 2 - exactly once
14
Segurança e Qualidade de Serviço
● QoS 0
○ É conhecido como “best-effort” pois se assemelha ao protocolo UDP pois não se tem
confirmação de entrega de mensagem. Não tem obrigação de manter a mensagem
armazenada.
● QoS 1
○ Existem a confirmação de entrega da mensagem. Atende situações onde quem envia
acaba gerando várias mensagens iguais possivelmente por um atraso na chegada de
confirmação de recebimento.
● QoS 2
○ Garante que a mensagem seja entregue exatamente uma vez, com envio de confirmações
de recebimentos. É o mais próximo do protocolo TCP.
15
Segurança e Qualidade de Serviço
16Figura retirada de: https://www.slideshare.net/paolopat/io-t-protocols-landscape
Implementações e Exemplos
● Tem-se várias implementações para clientes e Brokers MQTT
○ Open Source ou não
○ Linguagens: Java, C, C#, Javascript e Python
● Broker Open Source Mosquitto
○ Windows, MAC, Linux, Raspberry Pi, …
● Porém, também existem Brokers privados
17
Implementações e Exemplos
● Exemplos de comandos do Mosquitto
○ mosquitto_sub → Subscrever em um tópico
○ mosquitto_pub → Publicar em um tópico
○ -m “message” → Mensagens enviadas pelos publicadores
○ -h localhost → Especifica o host o qual deve ser conectado (por default é o localhost)
○ -t topic → O tópico do MQTT sobre o qual publica a mensagem
○ -q 0/1/2 → Especifica a qualidade do serviço a ser usada para a mensagem, de 0, 1 e 2
○ -u username → Especifica o username a ser usado para autenticação com o Broker
○ -d → Habilita mensagens debug
○ -i → Especifica o id do cliente (de quem usa)
○ ...
18
Implementações e Exemplos
● Que tal praticarmos um pouco usando o
protocolo MQTT?!
○ Passo 1: instale o Broker Mosquitto em sua
máquina!
■ https://mosquitto.org/download/
○ Passo 2: Abra o terminal e digite o seguinte
comando:
■ mosquitto_sub -t topico/teste
○ Passo 3: Abra outro terminal em sua máquina
e digite o comando:
■ mosquitto_pub -t topico/teste -m “Hello Everybody”
19
Implementações e Exemplos
20
Rápido, simples e fácil!
Implementações e Exemplos
21
● Mas era só isso mesmo??
● Então que tal ver algo
mais complexo usando o
protocolo MQTT...
Implementações e Exemplos
22
● Neste exemplo iremos usar:
nodeMCU Broker Open Source Arduino (IDE)
Implementações e Exemplos
23
Pub (topic, data)
Sub (topic)
Pub (topic, data)
Implementações e Exemplos
24
// LIBRARIES
#include "DHT.h"
#include <Adafruit_Sensor.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// PINOS UTILIZADOS PARA OS LEDS E O SENSOR
#define DHTPIN D4
#define PinBlue D5
#define PinRed D6
#define DHTTYPE DHT11
// DEFININDO ALGUMAS CONSTANTES E VARIAVEIS
String topic = "nodeMCU";
int errorConectionMQTT = -2;
int status = WL_IDLE_STATUS;
IPAddress server(192, 168, 0, 105);
const char ssid[] = "........";
const char password[] = "................";
//const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
//SETUP
void setup() {
// comunicação
Serial.begin(9600);
Serial1.begin(9600);
// pinos
pinMode(PinBlue, OUTPUT);
pinMode(PinRed, OUTPUT);
// sensor e rede
dht.begin();
InitWiFi();
client.setServer(mqtt_server,1883);
}
void InitWiFi(){
if (WiFi.status() == WL_NO_SHIELD){
Serial.println("modulo WiFi não conectado");
while(true);
}
Serial.println("Conectando ao AP ...");
while ( status != WL_CONNECTED) {
Serial.print("Tentando conectar ao WPA SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, password);
delay(500);
}
Serial.println("Conectando ao AP");
}
Implementações e Exemplos
25
// CAPTURANDO O DADO DO SENSOR E GERANDO UM JSON PARA SER
ENVIADO
void getSensorData(){
//Serial.println("Inicializando o sensor!");
digitalWrite(PinRed, HIGH);
float umid = dht.readHumidity();
float temp = dht.readTemperature();
// Verifica se existe erro na leitura do sensor de temperatura!
if (isnan(umid) || isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
digitalWrite(PinRed, LOW);
digitalWrite(PinBlue, HIGH);
return;
}
// convertendo para string
String temperatura = String(temp);
String umidade = String(umid);
// debugando mensagens
Serial.print( "Enviando os dados de umidade e temperatura : [" );
Serial.print(umidade);
Serial.print(" ] [ ");
Serial.print(temperatura);
Serial.print( " ] -> " );
// JSON
String payload = " { ";
payload += ""topico":""; payload += topic;
payload += "" , ";
payload += ""Umidade":"; payload += umidade;
payload += " , ";
payload += ""Temperatura":"; payload += temperatura;
payload += " } ";
// Send payload
char attributes[1000];
payload.toCharArray( attributes,1000);
client.publish("nodeMCU", attributes);
Serial.println( attributes );
digitalWrite(PinRed, HIGH);
digitalWrite(PinBlue, LOW);
delay(4000);
}
Implementações e Exemplos
26
// CASO O CAIA A CONEXÃO COM O BROKER, TENTA-SE RECONECTAR.
void reconnect() {
while (!client.connected()) {
Serial.print("Tentando conectar com o Broker ...");
if (client.connect("esp8266Client")) {
Serial.println("Conectado!");
} else {
//
char attributes2[100];
String payload = " { ";
payload += ""error":"; payload += errorConectionMQTT;
payload += " } ";
payload.toCharArray( attributes2, 100 );
client.publish("nodeMCU", attributes2 );
//
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" tentando em 5 segundos ");
delay(5000);
}
}
}
// CHAMA TODOS AS FUNÇÕES NO LOOP
void loop() {
status = WiFi.status();
if (status != WL_CONNECTED){
while(status != WL_CONNECTED){
Serial.print("Tentando conexão para WPA SSID: ");
Serial.println(ssid);
// conectando com a rede
status = WiFi.begin(ssid,password);
delay(500);
}
Serial.println("Conectado ao AP");
}
// tentando se reconectar
if (!client.connected()){
reconnect();
}
getSensorData();
delay(2000);
client.loop();
}

Protocolo MQTT - Redes de Computadores

  • 1.
    Protocolo MQTT Maurício MoreiraNeto Orientador: José Neuman de Souza
  • 2.
    2 Mas primeiro, vamosrevisar o conteúdo da aula anterior...
  • 3.
    Sumário ● O queé o protocolo MQTT? ● Vantagens ● Componentes do Modelo ● Segurança e Qualidade de Serviço ● Implementações e Exemplos 3
  • 4.
    O que éo protocolo MQTT? ● Message Queue Telemetry Transport (MQTT) é um protocolo leve para dispositivos de IoT e otimizado para rede TCP/IP, criada pela IBM no final dos anos 90 ● Utiliza o paradigma publish-subscribe ● Criado inicialmente para sistemas de supervisão e coleta de dados (SCADA) 4
  • 5.
    O que éo protocolo MQTT? Mas por que o MQTT se tornou um protocolo tão utilizado para internet das coisas? 5
  • 6.
    O que éo protocolo MQTT? ● Desenvolvido para hardware de dispositivo altamente restringido em poder computacional e em redes de largura da banda limitada e de alta latência ● Sistema de comunicação assíncrona ○ Desacopla emissor de receptor ● Prove distribuição de mensagens um-para-muitos, muitos-para-muitos e desacoplamento de aplicações ● Apresenta 3 níveis de QoS 6
  • 7.
    Por que nãousar outros protocolos?? 7
  • 8.
    O que éo protocolo MQTT? ● Por que não usar o HTTP? ○ Síncrono ■ Cliente espera que o servidor responda ■ Alta latência ○ Unidirecional ■ Cliente precisa iniciar conexão ○ Um pra um ○ Pesado e cheio de regras ■ Não adequada para redes restritas 8
  • 9.
    Vantagens do MQTT ●O protocolo oferece algumas vantagens como: ○ Leveza (mínimo de overhead) - Header de 2 bytes ○ Open Source ○ "Confiabilidade" ○ Simplicidade 9
  • 10.
    Componentes do Modelo ●O MQTT é um protocolo que utiliza o paradigma pub-sub ● Neste paradigma tem-se três componentes principais: ○ Publishers - Elementos que publicam a mensagem em um tópico ○ Subscribers - Elementos que se inscrevem no tópico e recebem as mensagens ○ Broker - Responsável pelo intermédio das trocas de mensagens 10
  • 11.
    Componentes do Modelo 11Figuraretirada de: https://www.slideshare.net/PaulaPea10/building-an-iot-app-using-mqtt
  • 12.
    Componentes do Modelo 12Figuraretirada de: http://programmingwithreason.com/article-mqtt-in-depth.html
  • 13.
    Componentes do Modelo 13Figuraretirada de: https://www.slideshare.net/PaulaPea10/building-an-iot-app-using-mqtt
  • 14.
    Segurança e Qualidadede Serviço ● A conexão entre o cliente e o Broker é feita via TCP (com opções login) e o uso de criptografia (SSL/TLS) ● O protocolo MQTT fornece 3 níveis de qualidade de serviço (QoS) indicando como deve ser a relação entre os elementos comunicantes ○ QoS 0 - at most once ○ QoS 1 - at least once ○ QoS 2 - exactly once 14
  • 15.
    Segurança e Qualidadede Serviço ● QoS 0 ○ É conhecido como “best-effort” pois se assemelha ao protocolo UDP pois não se tem confirmação de entrega de mensagem. Não tem obrigação de manter a mensagem armazenada. ● QoS 1 ○ Existem a confirmação de entrega da mensagem. Atende situações onde quem envia acaba gerando várias mensagens iguais possivelmente por um atraso na chegada de confirmação de recebimento. ● QoS 2 ○ Garante que a mensagem seja entregue exatamente uma vez, com envio de confirmações de recebimentos. É o mais próximo do protocolo TCP. 15
  • 16.
    Segurança e Qualidadede Serviço 16Figura retirada de: https://www.slideshare.net/paolopat/io-t-protocols-landscape
  • 17.
    Implementações e Exemplos ●Tem-se várias implementações para clientes e Brokers MQTT ○ Open Source ou não ○ Linguagens: Java, C, C#, Javascript e Python ● Broker Open Source Mosquitto ○ Windows, MAC, Linux, Raspberry Pi, … ● Porém, também existem Brokers privados 17
  • 18.
    Implementações e Exemplos ●Exemplos de comandos do Mosquitto ○ mosquitto_sub → Subscrever em um tópico ○ mosquitto_pub → Publicar em um tópico ○ -m “message” → Mensagens enviadas pelos publicadores ○ -h localhost → Especifica o host o qual deve ser conectado (por default é o localhost) ○ -t topic → O tópico do MQTT sobre o qual publica a mensagem ○ -q 0/1/2 → Especifica a qualidade do serviço a ser usada para a mensagem, de 0, 1 e 2 ○ -u username → Especifica o username a ser usado para autenticação com o Broker ○ -d → Habilita mensagens debug ○ -i → Especifica o id do cliente (de quem usa) ○ ... 18
  • 19.
    Implementações e Exemplos ●Que tal praticarmos um pouco usando o protocolo MQTT?! ○ Passo 1: instale o Broker Mosquitto em sua máquina! ■ https://mosquitto.org/download/ ○ Passo 2: Abra o terminal e digite o seguinte comando: ■ mosquitto_sub -t topico/teste ○ Passo 3: Abra outro terminal em sua máquina e digite o comando: ■ mosquitto_pub -t topico/teste -m “Hello Everybody” 19
  • 20.
  • 21.
    Implementações e Exemplos 21 ●Mas era só isso mesmo?? ● Então que tal ver algo mais complexo usando o protocolo MQTT...
  • 22.
    Implementações e Exemplos 22 ●Neste exemplo iremos usar: nodeMCU Broker Open Source Arduino (IDE)
  • 23.
    Implementações e Exemplos 23 Pub(topic, data) Sub (topic) Pub (topic, data)
  • 24.
    Implementações e Exemplos 24 //LIBRARIES #include "DHT.h" #include <Adafruit_Sensor.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> // PINOS UTILIZADOS PARA OS LEDS E O SENSOR #define DHTPIN D4 #define PinBlue D5 #define PinRed D6 #define DHTTYPE DHT11 // DEFININDO ALGUMAS CONSTANTES E VARIAVEIS String topic = "nodeMCU"; int errorConectionMQTT = -2; int status = WL_IDLE_STATUS; IPAddress server(192, 168, 0, 105); const char ssid[] = "........"; const char password[] = "................"; //const char* mqtt_server = "broker.hivemq.com"; WiFiClient espClient; PubSubClient client(espClient); DHT dht(DHTPIN, DHTTYPE); //SETUP void setup() { // comunicação Serial.begin(9600); Serial1.begin(9600); // pinos pinMode(PinBlue, OUTPUT); pinMode(PinRed, OUTPUT); // sensor e rede dht.begin(); InitWiFi(); client.setServer(mqtt_server,1883); } void InitWiFi(){ if (WiFi.status() == WL_NO_SHIELD){ Serial.println("modulo WiFi não conectado"); while(true); } Serial.println("Conectando ao AP ..."); while ( status != WL_CONNECTED) { Serial.print("Tentando conectar ao WPA SSID: "); Serial.println(ssid); status = WiFi.begin(ssid, password); delay(500); } Serial.println("Conectando ao AP"); }
  • 25.
    Implementações e Exemplos 25 //CAPTURANDO O DADO DO SENSOR E GERANDO UM JSON PARA SER ENVIADO void getSensorData(){ //Serial.println("Inicializando o sensor!"); digitalWrite(PinRed, HIGH); float umid = dht.readHumidity(); float temp = dht.readTemperature(); // Verifica se existe erro na leitura do sensor de temperatura! if (isnan(umid) || isnan(temp)) { Serial.println("Failed to read from DHT sensor!"); digitalWrite(PinRed, LOW); digitalWrite(PinBlue, HIGH); return; } // convertendo para string String temperatura = String(temp); String umidade = String(umid); // debugando mensagens Serial.print( "Enviando os dados de umidade e temperatura : [" ); Serial.print(umidade); Serial.print(" ] [ "); Serial.print(temperatura); Serial.print( " ] -> " ); // JSON String payload = " { "; payload += ""topico":""; payload += topic; payload += "" , "; payload += ""Umidade":"; payload += umidade; payload += " , "; payload += ""Temperatura":"; payload += temperatura; payload += " } "; // Send payload char attributes[1000]; payload.toCharArray( attributes,1000); client.publish("nodeMCU", attributes); Serial.println( attributes ); digitalWrite(PinRed, HIGH); digitalWrite(PinBlue, LOW); delay(4000); }
  • 26.
    Implementações e Exemplos 26 //CASO O CAIA A CONEXÃO COM O BROKER, TENTA-SE RECONECTAR. void reconnect() { while (!client.connected()) { Serial.print("Tentando conectar com o Broker ..."); if (client.connect("esp8266Client")) { Serial.println("Conectado!"); } else { // char attributes2[100]; String payload = " { "; payload += ""error":"; payload += errorConectionMQTT; payload += " } "; payload.toCharArray( attributes2, 100 ); client.publish("nodeMCU", attributes2 ); // Serial.print("Falha, rc="); Serial.print(client.state()); Serial.println(" tentando em 5 segundos "); delay(5000); } } } // CHAMA TODOS AS FUNÇÕES NO LOOP void loop() { status = WiFi.status(); if (status != WL_CONNECTED){ while(status != WL_CONNECTED){ Serial.print("Tentando conexão para WPA SSID: "); Serial.println(ssid); // conectando com a rede status = WiFi.begin(ssid,password); delay(500); } Serial.println("Conectado ao AP"); } // tentando se reconectar if (!client.connected()){ reconnect(); } getSensorData(); delay(2000); client.loop(); }