Soluções Completas em Automação Industrial

Conteúdos e materiais

O que é o Protocolo MQTT?

O que é o Protocolo MQTT?

O que é o Protocolo MQTT?

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.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.

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




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.


O que é o Protocolo MQTT?

Fale por WhatsApp