O que é o Protocolo MQTT?

O MQTT é um padrão de protocolo de mensagens para a Internet das Coisas (IoT).

Ele foi projetado para o transporte de mensagens de publicação/assinatura extremamente leve, ideal para conectar dispositivos utilizando código reduzido e largura de banda de rede mínima.

O protocolo MQTT hoje é usado em uma ampla variedade de indústrias, como automotiva, manufatura, telecomunicações, petróleo e gás, etc.

MQTT

O que significa a sigla MQTT?

MQTT (Message Queuing Telemetry Transport), é um protocolo de transporte de mensagens em fila para atividades de telemetria.

Podemos dizer que o protocolo MQTT serve para transportar mensagens de forma confiável e compatível para a comunicação entre máquinas (M2M) e de acordo com os conceitos do IoT (Internet of Things), onde é necessário utilizar pacotes pequenos e leves de dados em bandas estreitas de comunicação.

Por que utilizar o protocolo MQTT?

Este protocolo é leve e eficiente. Os equipamentos clientes MQTT são pequenos e simples, requerem recursos mínimos e podem ser usados ​​em microcontroladores pequenos.

Os cabeçalhos das mensagens MQTT são pequenos para otimizar a largura de banda da rede.

Visão geral do protocolo MQTT

O Comitê Técnico OASIS MQTT produz um padrão o protocolo compatível com MQTT V3.1, juntamente com requisitos para aprimoramentos, exemplos de uso documentados, práticas recomendadas e orientação para uso de tópicos MQTT com mecanismos de descoberta e registro de dispositivos na rede.

O padrão suporta mensagens bidirecionais para lidar uniformemente com sinais e comandos, entrega de mensagens determinísticas, níveis básicos de QoS, cenários “sempre/às vezes” conectado, acoplamento fraco e escalabilidade para suportar um grande número de dispositivos. Entre os pontos de melhoria estão: a priorização de mensagens, mensagens expiradas por tempo, carga de dados transportados e “time out” de registro de assinatura de dispositivos na rede.Arquitetura do MQTT

Como um protocolo de conectividade M2M/Internet of Things (IoT), o MQTT foi projetado para suportar o transporte de mensagens de locais/dispositivos remotos envolvendo pequenas áreas de código (por exemplo, microcontroladores de 8 bits e 256 KB de RAM), baixo consumo de energia, baixa largura de banda, alto custo conexões, alta latência, disponibilidade variável e garantias de entrega negociadas.

Por exemplo, o MQTT está sendo usado em sensores que se comunicam com um corretor por meio de links de satélite, SCADA, em conexões discadas ocasionais com provedores de saúde (dispositivos médicos) e em uma variedade de cenários de automação residencial e pequenos dispositivos.

O protocolo MQTT também é ideal para aplicativos móveis devido ao seu tamanho reduzido, pacotes de dados minimizados e distribuição eficiente de informações para um ou vários receptores (assinantes).

Estrutura do protocolo MQTTT

MQTT é um protocolo baseado em dados binários onde os elementos de controle são bytes binários e não strings de texto. O MQTT usa um formato de reconhecimento de comandos. Isso significa que cada comando tem uma confirmação associada.

MQTT estrutura do protocolo

Nomes de tópicos, ID de cliente, nomes de usuário e senhas são codificados como strings UTF-8.

A carga útil, excluindo as informações do protocolo MQTT, como ID do cliente, etc., são dados binários e o conteúdo e o formato são específicos do aplicativo.

O pacote MQTT ou formato de mensagem consiste em um cabeçalho fixo de 2 bytes (sempre presente) + cabeçalho variável (nem sempre presente) + carga útil (nem sempre presente).MQTT estrutura do protocolo

Os formatos de pacote possíveis são:

1 – Cabeçalho Fixo (Campo de Controle + Comprimento): Exemplo CONNACK

2 – Cabeçalho Fixo (Campo de Controle + Comprimento) + Cabeçalho Variável: Exemplo PUBACK

3 – Cabeçalho Fixo (campo de controle + Comprimento) + Cabeçalho Variável + Carga útil: Exemplo CONNECT

O campo de cabeçalho fixo consiste no campo de controle e no campo de comprimento de pacote de comprimento variável.

O tamanho mínimo do campo de comprimento do pacote é de 1 byte, que é para mensagens com um comprimento total inferior a 127 bytes (não incluindo os campos de controle e comprimento).

O tamanho máximo do pacote é 256 MB. Pacotes pequenos com menos de 127 bytes têm um campo de comprimento de pacote de 1 byte.

Pacotes maiores que 127 e menores que 16383 usarão 2 bytes. etc.

Nota: 7 bits são usados, ​​com o 8º bit sendo um bit de continuação.

O tamanho mínimo do pacote é de apenas 2 bytes com um campo de controle de um byte e um campo de comprimento de pacote de um byte. Por exemplo, a mensagem de desconexão é de apenas 2 bytes.

MQTT estrutura do protocolo

Campo de controle do protocolo MQTT

O campo de controle de 8 bits é o primeiro byte do cabeçalho fixo de 2 bytes. Ele é dividido em dois campos de 4 bits e contém todos os comandos e respostas do protocolo.

Os primeiros 4 bits mais significativos são o campo de tipo de comando ou mensagem e os outros 4 bits são usados ​​como flags de controle.

MQTT estrutura do protocolo

A tabela abaixo é extraída da especificação MQTT 3.1.1 e mostra uma amostra de comandos MQTT e seus códigos associados.

Como eles são a parte mais significativa de um campo de bytes de 8 bits, também apresentamos seus valores de bytes em decimal, como apareceriam no pacote de dados.

MQTT estrutura do protocolo

Flags de controle

Embora existam 16 flags possíveis, muito poucos são realmente usados.

A mensagem de publicação faz o um bom uso desses flags, conforme mostrado na tabela abaixo:

MQTT estrutura do protocolo

O duplicate flag é usado ao republicar uma mensagem com QOS 1 ou 2. Os flags de QOS são usados ​​ao publicar e indicam o nível 0, 1 ou 2. O flag Retain message também é usado na publicação.

Comprimento restante (Remaining Length)

Este é de comprimento variável entre 1 e 4 bytes. Cada byte usa 7 bits para o comprimento com o MSB usado como um sinalizador de continuação. O comprimento restante é o número de bytes após o campo de comprimento, inclui cabeçalho de comprimento variável e carga útil conforme ilustrado abaixo:

MQTT estrutura do protocolo

A figura a seguir ilustra o campo de comprimento para um tamanho de pacote de 64 e 321 bytes. O tamanho restante do pacote de 64 bytes requer apenas 1 byte.

MQTT estrutura do protocolo

O comprimento do pacote de 321 bytes requer um campo de comprimento restante de 2 bytes.

MQTT estrutura do protocolo

A tabela a seguir foi retirada da especificação e mostra os tamanhos dos pacotes e o campo de comprimento do pacote.

MQTT estrutura do protocolo

Cabeçalho de Comprimento Variável

Conforme mencionado anteriormente, o campo de cabeçalho de comprimento variável nem sempre está presente em uma mensagem MQTT. Certos tipos de mensagens ou comandos MQTT requerem o uso deste campo para transportar informações de controle adicionais.

O campo de cabeçalho de comprimento variável é semelhante, mas não o mesmo para todos os tipos de mensagem.

Exemplo de mensagem de conexão e desconexão do MQTT

Como ilustração, veremos agora os detalhes do pacote para uma mensagem de conexão.

Abaixo está um exemplo real de conexão e desconexão de cliente mostrando os valores reais de byte para os dados enviados e recebidos.

  • O código de controle CONNECT = 0x10
  • O código de controle CONNACK = 0x20

Pacote MQTT = controle + comprimento + nome do protocolo + nível de protocolo + flags de conexão + manter ativo + carga útil

MQTT estrutura do protocolo

Notas:

  • Observe os códigos de controle de conexão (0x10) e confirmação de conexão (0x20).
  • Observe o comprimento total de hex17 ou 23 bytes, não incluindo os campos de controle e comprimento. O campo de comprimento é de apenas 1 byte.
  • Você também deve poder ver o ID do cliente (python_test) no pacote enviado.
  • Ao olhar para os bytes de pacote reais, o Python imprime os valores hexadecimais, a menos que possa corresponder a um caractere ASCII. No exemplo acima, o campo keep alive é x00x3C, mas é exibido como x00<. Onde ASCII < = 0x3C

MQTT estrutura do protocolo

Tabelas de comandos Control Packet do protocolo MQTT

Control Packet

Variable Header

Payload

CONNECT Required Required
CONNACK None None
PUBLISH Required Optional
PUBACK Required None
PUBREC Required None
PUBREL Required None
PUBCOMP Required None
SUBSCRIBE Required Required
SUBACK Required Required
UNSUBSCRIBE Required Required
UNSUBACK Required Required
PINGREQ None None
PINGRESP None None
DISCONNECT None None

Análise de rede Wireshark

Para ilustrar uma questão sobre o protocolo TCP, foi criada esta captura de tela tirada do wireshark.

MQTT estrutura do protocolo

A figura apresenta um cliente MQTT conectando e publicando (QOS 1). Você pode ver claramente os pacotes ACK que têm um comprimento total de pacote de 58 bytes.

Sabemos que os pacotes ACK são de 2 bytes. Portanto, o pacote TCP sem MQTT tem cerca de 56 bytes.

O que também é interessante notar, é que cada comando ou resposta MQTT receberá um TCP ACK e talvez também um MQTT ACK.

Se você observar a captura de tela, perceberá que a conexão MQTT recebe uma resposta TCP ACK e uma resposta MQTT Connect ACK.

A resposta MQTT Connect ACK obtém uma resposta TCP ACK.

Especificação MQTT V3.1 Protocol Specification

Plataforma Eagle IoT industrial

Eagle - Plataforma IoT industrial

É um conjunto de soluções de hardware e software com a tecnologia Internet das Coisas (IoT) e foco na Gestão de Utilidades e Gestão de Ativos. A Plataforma Eagle IoT industrial foi desenvolvida para:

  • Redução de Custos Operacional;
  • Manutenção preventiva e preditiva;
  • Disponibilização de informações para a tomada de decisão.

A solução permite coletar informação em tempo real, a baixo custo e com agilidade e flexibilidade, para ganho de eficiência.

Áreas de aplicação da Plataforma Eagle IoT industrial

  • Grupos geradores;
  • Usinas solares;
  • Energia;
  • Iluminação;
  • Saneamento;
  • Climatização;
  • No-breaks;
  • Sistemas de aquecimento;
  • Gestão de utilidades.

Topologia da Plataforma Eagle IoT Industrial

Eagle - Plataforma IoT industrial

Gateways IG-8K e IG-9K

Eagle - Plataforma IoT industrialOs gateways Eagle são gateways WIFI/Ethernet/Celular para comunicação com equipamentos dotados de comunicação MODBUS e publicação dos dados coletados junto a eles a um broker MQTT.

Os mesmos podem operar, também, em modo Transparente (Bridge) em conjunto com sistemas on-premise, tornando bidirecional a comunicação no parque instalado, bem como coletar informações medidores de energia para posterior publicação.

Os gateways possuem FOTA (Firmware Over-The-Air ), possibilitando atualização remota sem necessidade de cabos e softwares de programação, auxiliando na manutenção à distância, de todos os gateways instalados em campo.

Conectividade

WiFi (802.11 b/g/n) – Utilizando antena externa 1, é possível estabelecer conexão sem fios à redes locais utilizando IP Fixo ou Dinâmico (DHCP).
Fast Ethernet (100Mbps) – Através do conector RJ45, o gateway pode se conectar a uma rede Ethernet cabeada, obtendo IP Fixo ou Dinâmico (DHCP).
Rede Celular (LTE, CAT-M1, NBIoT, 2G, 4G e pronto para o 5G) – IG-9k/M possui conexão com redes celulares, sendo capaz de utilizar os mesmos protocolos das redes WiFi e ETH.

Mais artigos sobre IoT