MQTT

MQTT
Logotipo do MQTT
EstadoPublicado
Ano de início1999; há 27 anos (1999)
Versão mais recente5.0
7 de março de 2019; há 7 anos (2019-03-07)
Organização
ComitêComitê Técnico do OASIS Message Queuing Telemetry Transport
EditoresAndrew Banks (IBM), Ed Briggs (Microsoft), Ken Borgendale (IBM), Rahul Gupta (IBM)
Padrões relacionadosMQTT-SN
Websitemqtt.org

MQTT é um protocolo de comunicação de rede máquina a máquina (M2M), leve e de publicação–subscrição, para serviços de filas de mensagens. Ele foi projetado para conexões com locais remotos que possuem dispositivos com restrições de recursos ou largura de banda de rede limitada, como na Internet das Coisas (IoT). Ele deve ser executado sobre um protocolo de transporte que forneça conexões bidirecionais ordenadas e sem perdas — tipicamente, TCP/IP. É um padrão aberto da OASIS e uma recomendação da ISO (ISO/IEC 20922).

Histórico

Andy Stanford-Clark (IBM) e Arlen Nipper (então trabalhando na Arcom Control Systems) criaram a primeira versão do protocolo em 1999. Ele foi usado para monitorar oleodutos dentro do sistema de controle industrial SCADA. O objetivo era ter um protocolo que fosse eficiente em largura de banda, leve e consumisse pouca bateria, porque os dispositivos estavam conectados via link de satélite, o que era extremamente caro naquela época.

Historicamente, o "MQ" em "MQTT" veio da linha de produtos IBM MQ (então "MQSeries"), onde significa "Message Queue" (Fila de Mensagens). No entanto, o protocolo fornece mensagens de publicação e subscrição (sem filas, apesar do nome). Na especificação aberta pela IBM, como versão 3.1, o protocolo era chamado de "MQ Telemetry Transport". Versões subsequentes lançadas pela OASIS referem-se estritamente ao protocolo apenas como "MQTT", embora o comitê técnico em si seja chamado de "Comitê Técnico de Message Queuing Telemetry Transport da OASIS". Desde 2013, "MQTT" não é uma sigla para nada.

Em 2013, a IBM submeteu o MQTT v3.1 ao órgão de especificação da OASIS com um estatuto que garantiu que apenas pequenas alterações na especificação pudessem ser aceitas. Após assumir a manutenção do padrão da IBM, a OASIS lançou a versão 3.1.1 em 29 de outubro de 2014. Uma atualização mais substancial para o MQTT versão 5, adicionando vários novos recursos, foi lançada em 7 de março de 2019.

Especificações derivadas

MQTT-SN (MQTT para Redes de Sensores) é uma variação do protocolo principal voltada para dispositivos embarcados alimentados por bateria em redes não-TCP/IP. Qualquer rede que forneça transporte bidirecional pode ser usada (como UDP e links seriais), embora o Zigbee seja o alvo de projeto original. A comunicação dentro de uma rede MQTT-SN, bem como com a rede MQTT externa, é coordenada por um "Gateway MQTT-SN".

Visão geral

Estrutura padrão publish-subscriber do MQTT

O protocolo MQTT define dois tipos de entidades de rede: um broker de mensagens e vários clientes. Um broker MQTT é um servidor que recebe mensagens de clientes publicadores e, em seguida, as roteia para os clientes de destino apropriados. Um cliente MQTT é qualquer dispositivo (desde um microcontrolador até um servidor completo) que executa uma biblioteca MQTT e se conecta a um broker MQTT através de uma rede.

As informações são organizadas em uma hierarquia de tópicos. Quando um publicador tem um novo item de dados para distribuir, ele envia uma mensagem de controle com os dados para o broker conectado. O broker então distribui a informação para quaisquer clientes que tenham se inscrito nesse tópico. O publicador não precisa ter nenhum dado sobre o número ou a localização dos assinantes; e os assinantes, por sua vez, não precisam ser configurados com nenhum dado sobre os publicadores.

Se um broker receber uma mensagem sobre um tópico para o qual não há assinantes no momento, o broker descarta a mensagem, a menos que o publicador da mensagem tenha designado a mensagem como uma mensagem retida (retained message). Uma mensagem retida é uma mensagem MQTT normal com o sinalizador de retenção definido como verdadeiro. O broker armazena a última mensagem retida e a respectiva qualidade de serviço (QoS) para o tópico selecionado. Cada cliente que se inscreve em um padrão de tópico que corresponde ao tópico da mensagem retida recebe a mensagem retida imediatamente após se inscrever. O broker armazena apenas uma mensagem retida por tópico. Isso permite que novos assinantes de um tópico recebam o valor mais atual, em vez de esperar pela próxima atualização de um publicador.

Quando um cliente publicador se conecta ao broker pela primeira vez, ele pode configurar uma mensagem padrão a ser enviada aos assinantes caso o broker detecte que o cliente publicador foi desconectado inesperadamente do broker.

Os clientes interagem apenas com um broker, mas um sistema pode conter vários servidores broker que trocam dados com base nos tópicos de seus assinantes atuais.

Uma mensagem de controle MQTT mínima pode ter apenas dois bytes de dados. Uma mensagem de controle pode carregar quase 256 megabytes de dados, se necessário. Existem 14 tipos de mensagens definidos usados para conectar e desconectar um cliente de um broker, publicar dados, confirmar o recebimento de dados e supervisionar a conexão entre cliente e servidor.

O MQTT baseia-se no protocolo TCP para a transmissão de dados. Uma variante, o MQTT-SN, é usada sobre outros transportes, como UDP ou Bluetooth.

O MQTT envia credenciais de conexão em formato de texto simples e não inclui nenhuma medida de segurança ou autenticação. Isso pode ser fornecido usando o TLS para criptografar e proteger as informações transferidas contra interceptação, modificação ou falsificação.

A porta MQTT padrão não criptografada é 1883. A porta criptografada é 8883.

Broker MQTT

O broker MQTT é um software executado em um computador (localmente ou na nuvem), podendo ser construído pelo próprio usuário ou hospedado por terceiros. Ele está disponível em implementações de código aberto e proprietárias.

O broker atua como uma agência de correios. Os clientes MQTT não usam um endereço de conexão direto do destinatário pretendido, mas usam a linha de assunto chamada "Tópico" (Topic). Qualquer pessoa que se inscreva recebe uma cópia de todas as mensagens para esse tópico. Vários clientes podem se inscrever em um tópico de um único broker (capacidade de um para muitos), e um único cliente pode registrar inscrições em tópicos com vários brokers (muitos para um).

Cada cliente pode produzir e receber dados tanto publicando quanto se inscrevendo, ou seja, os dispositivos podem publicar dados de sensores e ainda ser capazes de receber informações de configuração ou comandos de controle (o MQTT é um protocolo de comunicação bidirecional). Isso ajuda tanto no compartilhamento de dados quanto no gerenciamento e controle de dispositivos. Um cliente não pode transmitir os mesmos dados para uma faixa de tópicos e deve publicar várias mensagens para o broker, cada uma com um único tópico fornecido.

Com a arquitetura de broker MQTT, os dispositivos clientes e a aplicação do servidor tornam-se desacoplados. Dessa forma, os clientes permanecem inconscientes das informações uns dos outros. O MQTT, se configurado para isso, pode usar criptografia TLS com conexões protegidas por certificado, nome de usuário e senha. Opcionalmente, a conexão pode exigir certificação, na forma de um arquivo de certificado que um cliente fornece e que deve corresponder à cópia do servidor.

Em caso de falha, o software broker e os clientes podem alternar automaticamente para um broker de backup redundante/automático. Brokers de backup também podem ser configurados para compartilhar a carga de clientes entre vários servidores no local, na nuvem ou em uma combinação de ambos.

O broker pode dar suporte tanto ao MQTT padrão quanto ao MQTT para especificações compatíveis, como o Sparkplug. Isso pode ser feito com o mesmo servidor, ao mesmo tempo e com os mesmos níveis de segurança.

O broker monitora todas as informações da sessão à medida que o dispositivo entra e sai do ar, em uma função chamada "sessões persistentes" (persistent sessions). Nesse estado, um broker armazenará as informações de conexão para cada cliente, os tópicos aos quais cada cliente se inscreveu e quaisquer mensagens para um tópico com QoS 1 ou 2.

As principais vantagens de um broker MQTT são:

  1. Eliminação de conexões de clientes vulneráveis e inseguras (quando configuradas adequadamente).
  2. Capacidade de escalar facilmente de um único dispositivo para milhares.
  3. Gerenciamento e rastreamento de estados de conexão de clientes, incluindo credenciais de segurança e certificados (quando configurados adequadamente).
  4. Redução da carga em redes celulares ou de satélite sem comprometer a segurança (quando configuradas adequadamente).

Tipos de mensagem

Connect

Exemplo de conexão MQTT (QoS 0) com conexão, publicação/inscrição e desconexão. A primeira mensagem do cliente B é armazenada devido ao sinalizador de retenção (retain).

Aguarda o estabelecimento de uma conexão com o servidor e cria um link entre os nós.

Disconnect

Aguarda o cliente MQTT terminar qualquer trabalho pendente e a sessão TCP/IP ser desconectada.

Publish

Retorna imediatamente para a thread da aplicação após passar a requisição para o cliente MQTT.

Versão 5.0

Em 2019, a OASIS lançou o padrão oficial MQTT 5.0. A versão 5.0 inclui os seguintes novos recursos principais:

Qualidade de serviço

Cada conexão com o broker pode especificar uma medida de QoS. Elas são classificadas em ordem crescente de sobrecarga (overhead):

Este campo não afeta o tratamento das transmissões de dados TCP subjacentes; ele é usado apenas entre remetentes e receptores MQTT.

Segurança

O protocolo MQTT versão 3.1.1 exige que o servidor (broker) use um tempo limite (timeout) que seja uma vez e meia o valor de keepalive especificado pelo cliente. Isso (e funcionalidades semelhantes de keepalive em outros protocolos, como o HTTP) permite um ataque de negação de serviço (Slow DoS attack) publicado em 2020 chamado SlowITe, no qual o atacante tenta abrir e manter o máximo possível de conexões, privando usuários legítimos de suas conexões. Novas variações do ataque e novos métodos de detecção/mitigação são tópicos de pesquisa atual.

Agrupamento (clustering)

A especificação MQTT define a comunicação entre um cliente e um único broker, e não especifica a comunicação entre brokers. Implantações que precisam de mais capacidade ou disponibilidade do que um único broker fornece dependem de mecanismos específicos de implementação. As duas abordagens comuns são a ponte (bridging), na qual um broker se conecta a outro broker como cliente e encaminha mensagens para tópicos selecionados, e o agrupamento (clustering), no qual um grupo de nós de broker compartilha o estado de inscrição e de sessão e aparece para os clientes como um único broker lógico.

O Eclipse Mosquitto implementa pontes através da configuração do broker. Brokers agrupados (clustered) como EMQX e HiveMQ executam como sistemas de múltiplos nós cujos nós compartilham sessões de clientes, inscrições de tópicos e informações de roteamento. Um estudo de 2020 que comparou implantações distribuídas de três brokers MQTT em um cluster de edge-gateway encontrou diferenças substanciais entre as implementações em termos de vazão (throughput), latência e perda de mensagens durante a falha de um nó.

Limitações

Ordenação de mensagens

O MQTT não garante que as mensagens publicadas por clientes independentes cheguem aos assinantes na ordem em que foram geradas. A especificação MQTT da OASIS fornece garantias de ordenação apenas dentro de uma única sessão de cliente em um único tópico; eventos originados de clientes separados ou gerados em conexões independentes podem ser entregues fora de sequência.

Essa limitação é particularmente relevante em implantações de IoT que usam eventos de ciclo de vida do MQTT (notificações de conexão e desconexão) para rastrear o estado de conectividade do dispositivo. As principais implementações de broker reconhecem isso diretamente: a Amazon Web Services afirma em sua documentação de desenvolvedor do AWS IoT Core que "as mensagens de ciclo de vida podem ser enviadas fora de ordem" e que os assinantes "podem receber mensagens duplicadas". Da mesma forma, a documentação de engenharia da HiveMQ observa que "a ordenação estrita entre clientes publicadores requer estratégias adicionais, como roteamento dedicado e números de sequência."

A consequência prática é que uma notificação de desconexão gerada antes de uma notificação de reconexão pode chegar à aplicação assinante depois dela, fazendo com que os sistemas de monitoramento que aplicam uma política de última escrita vence (last-write-wins) registrem um dispositivo como offline quando ele já tiver se reconectado. Este é um modo de falha conhecido em arquiteturas orientadas a eventos e foi caracterizado na literatura de sistemas distribuídos como uma propriedade inerente da passagem de mensagens assíncronas por Leslie Lamport em 1978. Testes de desempenho (benchmarks) independentes documentaram o custo operacional de inversões de ordenação de eventos em implantações de IoT em produção.

As mitigações comumente aplicadas incluem janelas de debounce (atrasar a ação em eventos de desconexão por um intervalo fixo para permitir que mensagens que chegam tarde sejam processadas), padrões de votação (polling) ou nova consulta, e numeração de sequência na camada de aplicação. Cada mitigação impõe concessões: as janelas de debounce introduzem latência de detecção para eventos genuínos de desconexão e podem suprimir notificações legítimas; o polling adiciona sobrecarga de rede e é inadequado para sensores passivos.

Ver também

Referências

  1. 1 2 3 4 5 6 «MQTT Version 5.0» (em inglês). OASIS. 7 de março de 2019. Consultado em 15 de dezembro de 2020
  2. ↑ «ISO/IEC 20922:2016 Information technology — Message Queuing Telemetry Transport (MQTT) v3.1.1» (em inglês). Consultado em 27 de outubro de 2024
  3. 1 2 3 «OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee Charter» (em inglês). OASIS. Consultado em 15 de dezembro de 2020
  4. ↑ «MQTT SN Subcommittee» (em inglês). OASIS. Consultado em 15 de dezembro de 2020
  5. ↑ «10th birthday party». MQTT.org. Julho de 2009. Consultado em 25 de abril de 2015. Cópia arquivada em 15 de março de 2015
  6. ↑ «Transcript of IBM podcast» (PDF). IBM.com. Novembro de 2011. Consultado em 7 de janeiro de 2021
  7. ↑ «Getting Started with MQTT». HiveMQ. 24 de abril de 2020
  8. 1 2 Team, The HiveMQ. «Introducing the MQTT Protocol – MQTT Essentials: Part 1». HiveMQ (em inglês). Consultado em 26 de setembro de 2021
  9. ↑ «MQTT v3.1 and MQTT v3.1.1 Differences». OASIS Message Queuing Telemetry Transport (MQTT) TC. 12 de fevereiro de 2015. Consultado em 19 de agosto de 2021
  10. ↑ «MQTT V3.1 Protocol Specification». Eurotech, International Business Machines Corporation (IBM). 2010. Consultado em 15 de dezembro de 2020
  11. ↑ «OASIS MQTT Technical Committee Minutes of for the meeting of Thursday, 25th April 2013 Teleconference» (PDF)
  12. ↑ «MQTT Version 3.1.1». 29 de outubro de 2014. Consultado em 16 de dezembro de 2020
  13. ↑ «6 facts why it's worth upgrading to the brand new MQTT 3.1.1 version». 30 de outubro de 2014. Consultado em 16 de dezembro de 2020
  14. ↑ «Differences between 3.1.1 and 5.0». GitHub
  15. 1 2 3 Stanford-Clark, Andy; Hong Linh Truong (14 de novembro de 2013). «MQTT For Sensor Networks (MQTT-SN) Protocol Specification Version 1.2» (PDF). OASIS Open. OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee. p. 28. Consultado em 15 de dezembro de 2020
  16. ↑ «Introduction to MQTT-SN (MQTT for Sensor Networks)» (em inglês). 25 de janeiro de 2017. Consultado em 16 de setembro de 2020
  17. ↑ Yuan, Michael. «Getting to know MQTT». IBM Developer. Consultado em 13 de outubro de 2019
  18. ↑ «Client, Broker / Server and Connection Establishment - MQTT Essentials: Part 3». HiveMQ. 17 de julho de 2019. Consultado em 13 de outubro de 2019
  19. ↑ «Retained Messages – MQTT Essentials: Part 8». HiveMQ. 2 de março de 2015. Consultado em 13 de outubro de 2019
  20. ↑ «FAQ – Frequently Asked Questions». MQTT.org (em inglês). Consultado em 19 de março de 2020
  21. ↑ «MQTT Sparkplug/Tahu». www.cirrus-link.com. Consultado em 5 de novembro de 2019
  22. ↑ Cope, Stephen (2020). MQTT For Complete Beginners. [S.l.]: Wydawca nieznany. p. 17. ISBN 9798779030762
  23. ↑ «What is MQTT? Definition and Details». www.paessler.com (em inglês). Consultado em 9 de junho de 2020
  24. ↑ «IBM Knowledge Center - IBM MQ - Using MQTT with IBM Integration Bus - Quality of service and connection management». www.ibm.com (em inglês). Consultado em 30 de janeiro de 2018
  25. ↑ Vaccari, I., Aiello, M., Cambiaso, E. (2020). SlowITe, a novel denial of service attack affecting MQTT. Sensors, 20(10), 2932. doi:10.3390/s20102932.
  26. ↑ CVE-2020-13849.
  27. ↑ Longo, Edoardo; Redondi, Alessandro E. C.; Cesana, Matteo; Arcia-Moret, Andres; Manzoni, Pietro (junho de 2020). «MQTT-ST: a Spanning Tree Protocol for Distributed MQTT Brokers». ICC 2020 – 2020 IEEE International Conference on Communications. pp. 1–6. arXiv:1911.07622Acessível livremente. doi:10.1109/ICC40277.2020.9149046
  28. ↑ Longo, Edoardo; Redondi, Alessandro E. C.; Cesana, Matteo; Manzoni, Pietro (setembro de 2022). «BORDER: A Benchmarking Framework for Distributed MQTT Brokers». IEEE Internet of Things Journal. 9 (18): 17728–17740. doi:10.1109/JIOT.2022.3155872. hdl:11311/1220900Acessível livremente
  29. ↑ «mosquitto.conf – the configuration file for mosquitto». mosquitto.org. Consultado em 21 de julho de 2026
  30. ↑ «EMQX Clustering». docs.emqx.com. Consultado em 21 de julho de 2026
  31. ↑ «HiveMQ MQTT Broker Clusters». docs.hivemq.com. Consultado em 21 de julho de 2026
  32. ↑ Koziolek, Heiko; Grüner, Sten; Rückert, Julius (2020). «A Comparison of MQTT Brokers for Distributed IoT Edge Computing». Software Architecture – ECSA 2020. Lecture Notes in Computer Science. 12292. Springer. pp. 352–368. doi:10.1007/978-3-030-58923-3_23
  33. ↑ «MQTT Version 5.0 – Section 4.6: Message Ordering». OASIS. 7 de março de 2019. Consultado em 6 de abril de 2026
  34. ↑ «AWS IoT Core – Lifecycle events». Amazon Web Services. Consultado em 6 de abril de 2026
  35. ↑ «Understanding MQTT Message Ordering». HiveMQ. Consultado em 6 de abril de 2026
  36. ↑ Lamport, Leslie (julho de 1978). «Time, Clocks, and the Ordering of Events in a Distributed System». Communications of the ACM. 21 (7): 558–565. doi:10.1145/359545.359563
  37. ↑ «Multi-Signal Device State Resolution Dataset (1.3M Events)». Zenodo. 2025. Consultado em 6 de abril de 2026
  38. ↑ «Understanding MQTT Message Ordering». HiveMQ. Consultado em 6 de abril de 2026
  39. ↑ «APIs & Protocols». Solace (em inglês). Consultado em 8 de abril de 2021
  40. ↑ «MQTT 5.0 Support 🎉». Solace Community (em inglês). 4 de janeiro de 2021. Consultado em 8 de abril de 2021

Ligações externas