Fundamentos de MQTT

O Que É um Broker MQTT? Guia para Iniciantes sobre Mensageria Publish/Subscribe

Um broker MQTT é o hub que roteia cada mensagem entre dispositivos IoT e aplicações. Aprenda publish/subscribe, topics e wildcards, sessões, QoS, retained messages e last will, e coloque a mão na massa em minutos.

Ilustração de um broker MQTT roteando mensagens entre sensores que publicam e aplicações assinantes
Rode isso no seu próprio broker MQTTTenha um broker MQTT privado e gerenciado no plano Free e comece com exemplos de código prontos.
Teste grátis Exemplos de código Sem cartão de crédito

Um broker MQTT é o servidor central que recebe todas as mensagens MQTT e as entrega aos clientes que as solicitaram. Neste guia para iniciantes você vai aprender como funciona o modelo publish/subscribe, o que um broker MQTT faz nos bastidores, como topics e wildcards são estruturados, quais as diferenças entre MQTT 3.1.1 e 5.0, e como enviar suas primeiras mensagens pela linha de comando e em Python.

O Que É MQTT?

MQTT é um protocolo de mensageria leve, projetado para dispositivos com banda, energia ou capacidade de processamento limitadas. Ele roda sobre TCP (e sobre WebSocket para navegadores), tem um cabeçalho fixo minúsculo de apenas dois bytes e mantém uma única conexão de longa duração aberta, em vez de fazer polling. Isso o torna uma escolha natural para sensores, gateways, veículos, medidores inteligentes e máquinas industriais, de uma usina em Minas Gerais a um frigorífico no Paraná, e igualmente útil para dashboards e serviços de backend que consomem esses dados.

MQTT é um padrão aberto da OASIS; a página oficial do protocolo é mqtt.org.

O Modelo Publish/Subscribe

Em um sistema clássico de request/response, como o HTTP, o cliente chama um servidor específico e espera a resposta. O MQTT usa publish/subscribe:

  • Um publisher envia uma mensagem para um topic, por exemplo home/livingroom/temperature.
  • Um subscriber informa ao broker em quais topics tem interesse.
  • O broker fica no meio e encaminha cada mensagem para todos os subscribers cuja assinatura corresponde ao topic.

O fluxo fica assim:

[Temperature sensor] --PUBLISH home/livingroom/temperature 22.5--> [MQTT broker]
[MQTT broker] --deliver--> [Mobile app]       (subscribed to home/+/temperature)
[MQTT broker] --deliver--> [Analytics service] (subscribed to home/#)

Três tipos de desacoplamento tornam isso poderoso:

  • Espaço: o sensor não conhece o endereço do app, e o app não conhece o do sensor. Ambos só conhecem o broker.
  • Tempo: com sessões persistentes e retained messages, o subscriber não precisa estar online no exato momento em que a mensagem é publicada.
  • Escala: adicionar o décimo ou o milésimo subscriber não muda nada no publisher.

O Que Faz um Broker MQTT?

O broker MQTT é muito mais do que um repetidor. Ele cuida de várias tarefas ao mesmo tempo.

Gerenciar conexões

Cada cliente abre uma conexão TCP, TLS ou WebSocket e envia um pacote CONNECT com um client ID, usuário e senha opcionais, um intervalo de keep-alive e flags de sessão. O broker autentica o cliente, responde com CONNACK e depois monitora a conexão com PINGREQ/PINGRESP para detectar clientes que caíram.

Manter sessões

Uma sessão guarda as assinaturas de um cliente e as mensagens enfileiradas enquanto ele estava offline. Com uma clean session, o estado é descartado na desconexão. Com uma sessão persistente, o broker o mantém, e um dispositivo que perde a rede móvel recebe o que perdeu quando volta. O MQTT 5 substitui a antiga flag liga/desliga por um session expiry interval medido em segundos.

Rotear por topic

Cada PUBLISH recebido é comparado com todas as assinaturas ativas, incluindo filtros com wildcard, e entregue aos clientes correspondentes. O roteamento é o coração do broker MQTT, e é por isso que o design de topics importa.

Retained messages

O publisher pode ativar a flag retain. O broker guarda a última retained message de cada topic e a envia imediatamente a qualquer novo subscriber. Isso é ideal para estados como device/42/status = online ou para a configuração mais recente: um dashboard aberto depois ainda vê o valor atual sem esperar a próxima atualização.

Last Will and Testament

Ao se conectar, o cliente pode registrar uma mensagem de "last will", por exemplo device/42/status = offline. Se o cliente sumir sem um DISCONNECT limpo (queda de energia, falha de rede, timeout de keep-alive), o broker publica o will em nome dele. Combinado com uma mensagem online retida, isso garante uma detecção de presença confiável.

Quality of Service

O MQTT define três garantias de entrega, e o broker as aplica nos dois trechos do caminho (publisher até o broker, broker até o subscriber):

QoS Nome Garantia Uso típico
0 At most once Envia e esquece, sem confirmação Leituras frequentes de sensores em que perder uma amostra não tem problema
1 At least once Confirmado com PUBACK, pode haver duplicatas A maior parte da telemetria e dos eventos
2 Exactly once Handshake em quatro etapas, sem duplicatas Faturamento, comandos que não podem se repetir

O QoS efetivo para um subscriber é o menor entre o QoS da publicação e o QoS da assinatura. Para se aprofundar, leia Níveis de QoS MQTT Explicados.

Topics e Wildcards MQTT

Topics são strings UTF-8 divididas em níveis por barras. Eles são criados na hora: não há nada para declarar com antecedência.

factory1/line1/cnc1/temperature
factory1/line1/cnc1/spindle_rpm
factory1/line2/press3/status
home/kitchen/light/state

Um bom design de topics vai do geral para o específico, evita barras iniciais e espaços e não coloca dados sensíveis nos nomes dos topics. Topics que começam com $ são reservados ao broker; por exemplo, o ConnectMQ publica $SYS/broker/connection/{clientId}/state.

Wildcard de um nível: +

O sinal de mais corresponde a exatamente um nível.

Filtro de assinatura Corresponde Não corresponde
factory1/+/cnc1/temperature factory1/line1/cnc1/temperature factory1/line1/cell2/cnc1/temperature
home/+/light/state home/kitchen/light/state home/light/state

Wildcard de vários níveis:

O sustenido corresponde a qualquer número de níveis, inclusive zero, e precisa ser o último caractere do filtro.

Filtro de assinatura Corresponde
factory1/# factory1, factory1/line1/cnc1/temperature, factory1/line2/press3/status
factory1/line1/# Tudo abaixo de factory1/line1
# Todos os topics que não começam com $ e que o cliente tem permissão de ver

Wildcards só podem ser usados na assinatura; a publicação é sempre em um topic concreto. Em projetos industriais, uma hierarquia consistente como a ISA-95 (empresa, site, área, linha, célula) se torna um Unified Namespace; veja Sparkplug B e Unified Namespace para esse padrão.

MQTT 3.1.1 vs MQTT 5.0

A maioria dos brokers e bibliotecas atuais suporta as duas versões. O MQTT 5.0 mantém o mesmo modelo e adiciona recursos que facilitam a operação de grandes implantações.

Recurso MQTT 3.1.1 MQTT 5.0
Retorno de erros Return codes limitados Reason codes na maioria das confirmações (por exemplo 0x97 Quota exceeded)
Duração da sessão Clean session liga/desliga Session expiry interval
Duração da mensagem Não disponível Message expiry interval
Balanceamento de carga Fora do padrão Shared subscriptions $share/{group}/{filter}
Economia de banda Topic completo toda vez Topic aliases
Request/response Convenções improvisadas Response topic e correlation data
Limites do broker Implícitos Anunciados no CONNACK (Maximum QoS, Receive Maximum etc.)
Metadados Só o payload User properties

Se você está começando um projeto novo, use MQTT 5.0, a menos que alguma biblioteca de dispositivo só suporte 3.1.1. A especificação completa é publicada pela OASIS em docs.oasis-open.org, e nosso panorama dos recursos do MQTT 5 cobre os destaques práticos.

Mão na Massa: Teste um Broker MQTT em Cinco Minutos

A forma mais rápida de entender um broker MQTT é usar um. O servidor MQTT público (gratuito) em broker.connectmq.com aceita testes anônimos e serve apenas para testes e protótipos, não para dados de produção.

Protocolo Porta URL
MQTT (TCP) 1883 mqtt://broker.connectmq.com:1883
MQTT sobre TLS 8883 mqtts://broker.connectmq.com:8883
WebSocket 8083 ws://broker.connectmq.com:8083/mqtt
WebSocket seguro 8084 wss://broker.connectmq.com:8084/mqtt

Regras do servidor MQTT público: conecte sem usuário nem senha, use um client ID único e não vazio (um client ID vazio é rejeitado) e lembre-se de que tudo o que você publica pode ser lido por qualquer pessoa. Escolha um prefixo aleatório como connectmq/demo/<your-random-id>/ e nunca envie dados pessoais ou sensíveis. Os limites são 64 KB por mensagem, 10 mensagens por segundo e 10 assinaturas por cliente, e até 8 níveis de topic.

Assine e publique com o mosquitto

Instale os clientes de linha de comando do Eclipse Mosquitto, abra um terminal e assine com um wildcard. Troque k9x2 por uma string aleatória sua:

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-k9x2 \
  -t "connectmq/demo/k9x2/#" -v

Em um segundo terminal, publique uma leitura:

mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-k9x2 \
  -t "connectmq/demo/k9x2/room1/temp" -m '{"temp":22.5}' -q 1

O primeiro terminal imprime:

connectmq/demo/k9x2/room1/temp {"temp":22.5}

Agora teste uma retained message. Publique um status com -r e depois inicie um novo subscriber que use apenas o wildcard de um nível:

mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-k9x2 \
  -t "connectmq/demo/k9x2/room1/status" -m "online" -r

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub2-k9x2 \
  -t "connectmq/demo/k9x2/+/status" -v -C 1

O novo subscriber recebe online imediatamente, mesmo tendo se conectado depois do envio da mensagem. É o broker guardando e reenviando o valor retido. Para apagá-lo, publique uma retained message vazia com -r -n.

Para tráfego criptografado, mude para a porta 8883, aponte o cliente para os certificados de CA do sistema (por exemplo --capath /etc/ssl/certs no Linux) e adicione -V mqttv5 para usar MQTT 5.0.

Exemplo em Python com last will

Instale o paho-mqtt 2.x com pip install paho-mqtt e execute:

import json
import uuid
import paho.mqtt.client as mqtt

BROKER = "broker.connectmq.com"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}"
CLIENT_ID = f"py-{uuid.uuid4().hex[:8]}"


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.subscribe(f"{PREFIX}/#", qos=1)
    client.publish(f"{PREFIX}/sensor1/status", "online", qos=1, retain=True)
    client.publish(f"{PREFIX}/sensor1/temp", json.dumps({"temp": 21.8}), qos=1)


def on_message(client, userdata, msg):
    print(f"{msg.topic} -> {msg.payload.decode()}")


client = mqtt.Client(
    mqtt.CallbackAPIVersion.VERSION2,
    client_id=CLIENT_ID,
    protocol=mqtt.MQTTv5,
)
client.will_set(f"{PREFIX}/sensor1/status", "offline", qos=1, retain=True)
client.on_connect = on_connect
client.on_message = on_message

client.connect(BROKER, 1883, keepalive=30)
client.loop_forever()

O script registra um last will, se anuncia como online com uma retained message e publica uma leitura de temperatura que ele mesmo recebe de volta pela própria assinatura com wildcard. Se você encerrar o processo abruptamente, o broker publica offline no topic de status assim que o keep-alive expirar.

Prefere usar o navegador? O mesmo broker aceita conexões WebSocket nas portas 8083 e 8084; veja MQTT sobre WebSocket.

Do Servidor MQTT Público à Produção

O servidor MQTT público é perfeito para aprender e prototipar, mas produção exige credenciais privadas, TLS e isolamento de outros usuários. O ConnectMQ opera o broker para você: crie um no portal, receba usuário, senha e client ID e conecte via mqtts:// na porta 8883. Seus topics ficam isolados de outros tenants e do servidor MQTT público, e o portal oferece um explorador de topics ao vivo, dashboards e regras de alerta. Leia o guia sobre o broker MQTT gerenciado para comparar as opções de hospedagem.

Comece com o ConnectMQ

Cadastre-se em app.connectmq.com para criar seu próprio broker MQTT no plano Serverless (Free), sem cartão de crédito. Em poucos minutos você estará enviando mensagens via TLS, com os mesmos comandos que acabou de testar.

Perguntas frequentes

O que é um broker MQTT, em termos simples?

Um broker MQTT é um servidor que recebe mensagens de clientes que publicam e as encaminha a todos os clientes assinantes de um topic correspondente. Os dispositivos nunca falam diretamente entre si; eles só falam com o broker.

Qual a diferença entre um broker MQTT e um cliente MQTT?

Um cliente é qualquer dispositivo ou aplicação que publica ou assina, como um sensor ou um dashboard. O broker é o servidor no meio que autentica os clientes, mantém as sessões e roteia as mensagens entre eles.

Qual porta um broker MQTT usa?

As portas padrão são 1883 para MQTT sem criptografia e 8883 para MQTT sobre TLS. Conexões WebSocket costumam usar portas separadas; no broker.connectmq.com elas são 8083 e 8084, com o caminho /mqtt.

Existe um broker MQTT gratuito para testar?

Sim. O servidor MQTT público broker.connectmq.com aceita testes anônimos, e o plano Serverless (Free) do ConnectMQ oferece um broker MQTT gerenciado privado com credenciais e TLS.

Devo usar MQTT 3.1.1 ou MQTT 5.0?

Use MQTT 5.0 em projetos novos, porque ele adiciona reason codes, expiração de sessão e de mensagem, shared subscriptions e topic aliases. Recorra ao 3.1.1 apenas quando uma biblioteca de dispositivo não suportar a versão 5.

Artigos relacionados

Por que Seu Cliente MQTT Fica Desconectando (e Como Corrigir)

Loops de reconexão estão entre os problemas mais comuns do MQTT. Conheça as cinco causas habituais, de client IDs duplicados a timeouts de keep alive e pacotes grandes demais, e siga um fluxo de diagnóstico que identifica a sua.

9 min de leitura

Quem Inventou o MQTT? A História dos Oleodutos à IoT

O MQTT foi inventado em 1999 por Andy Stanford-Clark, da IBM, e Arlen Nipper, da Arcom, para monitorar oleodutos via satélite. Acompanhe sua trajetória até o open source, a OASIS, a ISO e os brokers MQTT gerenciados na nuvem de hoje.

8 min de leitura

Todos os artigos →

Seu broker MQTT privado está a poucos cliques de distância

Crie uma conta, receba as credenciais do seu broker e conecte seu primeiro dispositivo — sem servidores para instalar, atualizar ou escalar.