Soluções Completas em Automação Industrial
Conteúdos e materiais
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 (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.
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.
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).
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.
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.
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.
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.
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.
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
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
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.