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.
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.
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.
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).
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.
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.
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.
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:
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:
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.
O comprimento do pacote de 321 bytes requer um campo de comprimento restante de 2 bytes.
A tabela a seguir foi retirada da especificação e mostra os tamanhos dos pacotes e o campo de comprimento do pacote.
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
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
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.
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
Fontes de consulta e créditos
http://www.steves-internet-guide.com/mqtt-protocol-messages-overview/
Produtos para IoT
Plataforma Eagle 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
Gateways IG-8K e IG-9K
Os 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
This post is also available in: Inglês
Você precisa fazer login para comentar.