Fundamentos

O que é MQTT? Uma introdução prática

O que é MQTT? Uma introdução prática ao protocolo MQTT: brokers, tópicos, publish/subscribe, QoS, mensagens retidas e Last Will — com exemplos práticos.

Atualizado · 7 min de leitura

MQTT (originalmente MQ Telemetry Transport) é um protocolo de mensagens leve construído sobre o padrão publish/subscribe. Os clientes nunca conversam diretamente entre si — eles enviam mensagens para um broker central, identificadas por um tópico, e o broker encaminha cada mensagem para todos os clientes que assinaram um tópico correspondente. Esse modelo simples é o motivo de o MQTT rodar em tudo, de redes de sensores e casas inteligentes a telemetria veicular e dashboards ao vivo.

Esta introdução explica como o MQTT funciona, quais são os recursos importantes e quando ele é (e quando não é) a ferramenta certa. Se quiser acompanhar na prática, abra o cliente MQTT online em outra aba.

Um breve histórico

O MQTT foi criado em 1999 por Andy Stanford-Clark (IBM) e Arlen Nipper para monitorar oleodutos por links de satélite caros e instáveis. Os objetivos do projeto — pacotes minúsculos, pouco código no cliente, tolerância a redes instáveis — acabaram se encaixando perfeitamente na Internet das Coisas. O MQTT 3.1.1 virou padrão OASIS em 2014 (e depois ISO/IEC 20922), e o MQTT 5.0 veio em 2019 com reason codes, user properties, expiração de mensagens e mais. As duas versões são amplamente usadas hoje; veja MQTT 5 vs 3.1.1 para as diferenças.

Como o MQTT funciona: publish/subscribe

Existem apenas dois papéis no MQTT:

  • Clientes — qualquer programa ou dispositivo que se conecta ao broker. Um cliente pode publicar, assinar ou fazer as duas coisas. Um sensor de temperatura, um app mobile e um serviço de backend são todos apenas clientes.
  • O broker — o servidor que aceita conexões, autentica clientes, faz o casamento de tópicos e entrega as mensagens. Brokers populares incluem Mosquitto, EMQX e HiveMQ.

Publicadores e assinantes são desacoplados: um publicador não sabe quem (se é que alguém) recebe sua mensagem, e os assinantes não sabem quem a enviou. Eles só compartilham o nome de um tópico. Isso facilita adicionar um novo consumidor — um dashboard, um gravador em banco de dados, um serviço de alertas — sem mexer nos dispositivos que produzem os dados.

Um fluxo de mensagens típico
sensor-17  --PUBLISH home/kitchen/temperature "21.5"-->  broker
broker     --PUBLISH home/kitchen/temperature "21.5"-->  dashboard   (subscribed to home/+/temperature)
broker     --PUBLISH home/kitchen/temperature "21.5"-->  logger      (subscribed to home/#)

Tópicos: o endereço de uma mensagem

Um tópico é uma string UTF-8 com níveis separados por barras, como factory/line-2/press-4/pressure. Tópicos não são criados com antecedência — eles passam a existir assim que alguém publica neles. Os assinantes podem usar dois curingas: + corresponde a exatamente um nível e # corresponde a qualquer número de níveis no final. Um bom design de tópicos faz muita diferença para permissões e escalabilidade; nosso guia de tópicos e curingas MQTT aborda isso em detalhes.

A conexão e seus pacotes

O MQTT roda sobre uma conexão de longa duração — geralmente TCP, opcionalmente envolvida em TLS, ou WebSockets para navegadores. A sessão começa com um pacote CONNECT (client ID, usuário e senha opcionais, keep-alive, Last Will) e o broker responde com CONNACK. Depois disso, os pacotes mais comuns são:

PacoteDireçãoFinalidade
PUBLISHambasTransporta uma mensagem: tópico, payload, QoS, flag retain
SUBSCRIBE / SUBACKcliente → broker / voltaRegistra um ou mais filtros de tópico
UNSUBSCRIBE / UNSUBACKcliente → broker / voltaRemove filtros de tópico
PINGREQ / PINGRESPcliente → broker / voltaMantém viva uma conexão ociosa
DISCONNECTcliente → broker (ambas no MQTT 5)Encerramento limpo; suprime o Last Will

O cabeçalho fixo de um pacote MQTT tem só dois bytes, e o payload é binário opaco — JSON, texto puro, Protobuf ou bytes brutos, tudo funciona. Esse overhead pequeno é o que torna o MQTT atraente em dispositivos com recursos limitados e redes tarifadas.

Principais recursos do MQTT

Quality of Service

Toda publicação e assinatura tem um nível de QoS: 0 (no máximo uma vez), 1 (pelo menos uma vez) ou 2 (exatamente uma vez). Níveis mais altos adicionam pacotes de confirmação em troca de garantias de entrega mais fortes. Detalhes e fluxos de pacotes estão em níveis de QoS do MQTT explicados.

Mensagens retidas

Uma mensagem publicada com a flag retain é armazenada pelo broker como o último valor conhecido daquele tópico e é entregue imediatamente a cada novo assinante. É ideal para estados como online/offline ou o setpoint atual. Veja mensagens retidas (retained).

Last Will and Testament

Um cliente pode registrar uma mensagem que o broker publica em seu nome caso o cliente desapareça sem um disconnect limpo — a forma padrão de detectar dispositivos offline. Veja Last Will and Testament.

Sessões persistentes

Com uma sessão persistente (cleanSession=false no 3.1.1, cleanStart=false mais um session expiry interval no MQTT 5), o broker lembra as assinaturas de um cliente e enfileira mensagens QoS 1 e 2 enquanto ele está offline, entregando-as quando ele se reconecta.

Experimente MQTT em dois minutos

A maneira mais rápida de entender MQTT é ver uma mensagem fazer a ida e volta. Conecte-se a um broker público, assine um tópico exclusivo e publique nele:

  1. Abra o cliente online e conecte-se a um broker da lista de brokers públicos.
  2. Assine testmqtt/your-name/#.
  3. Publique hello em testmqtt/your-name/greeting e veja a mensagem chegar.

Teste no cliente MQTT online

Ou, em um terminal com os clientes do Mosquitto instalados:

bash
# terminal 1
mosquitto_sub -h test.mosquitto.org -t 'testmqtt/intro/#' -v

# terminal 2
mosquitto_pub -h test.mosquitto.org -t 'testmqtt/intro/greeting' -m 'hello'

Quando usar MQTT (e quando não usar)

O MQTT se encaixa bem quando:

  • Muitos dispositivos enviam mensagens pequenas e frequentes (telemetria, leituras de sensores, status).
  • As redes são instáveis ou a banda é limitada, e você precisa de reconexão automática e fila para clientes offline.
  • Os dados precisam ser enviados aos clientes em tempo real em vez de consultados por polling.
  • Você quer distribuição um-para-muitos sem amarrar produtores a consumidores.

Ele se encaixa pior quando:

  • Você precisa de request/response com semântica rica — APIs HTTP simples são mais fáceis (o MQTT 5 adiciona response topics, mas continua sendo mensageria).
  • Você precisa de armazenamento de longo prazo ou replay de todo o histórico de eventos — isso é trabalho de um log como o Kafka ou de um banco de dados alimentado pelo MQTT.
  • Você transfere arquivos grandes; o MQTT consegue carregá-los, mas não foi projetado para isso.

Para uma comparação lado a lado, leia MQTT vs HTTP.

Próximos passos

Agora que você sabe o que é MQTT, aprenda a escolher níveis de QoS, projetar uma hierarquia de tópicos e testar um broker MQTT de ponta a ponta. Todos os guias estão na central de aprendizado MQTT.

Perguntas frequentes

MQTT é uma fila de mensagens?

Não no sentido clássico. MQTT é um protocolo publish/subscribe: as mensagens são roteadas por tópico para todos os assinantes correspondentes, em vez de serem consumidas uma única vez de uma fila. Os brokers enfileiram mensagens para clientes offline com sessões persistentes, e as shared subscriptions do MQTT 5 adicionam balanceamento de carga parecido com o de uma fila.

Qual porta o MQTT usa?

Por convenção, 1883 para TCP simples e 8883 para MQTT sobre TLS. Listeners WebSocket não têm um padrão fixo e variam de broker para broker, por exemplo 8083/8084, 8000/8884 ou 80/443.

Preciso instalar algo para experimentar MQTT?

Não. Um cliente no navegador como o TestMQTT consegue se conectar a um broker público via WebSockets seguros, assinar um tópico e publicar mensagens sem nenhuma instalação.