A versão curta
MQTT (Message Queuing Telemetry Transport) é um protocolo de mensagens leve, baseado em publicar e assinar, criado para dispositivos com enlace ruim, pouca memória e uma bateria que precisa durar.
Foi criado em 1999 por Andy Stanford-Clark, da IBM, e Arlen Nipper, da Arcom, para levar por satélite a telemetria de oleodutos. As condições eram implacáveis: a banda era cara e escassa, o enlace caía o tempo todo e os dispositivos eram fracos. Essas restrições moldaram tudo no protocolo — um cabeçalho mínimo, uma única conexão de longa duração e a capacidade de sobreviver a uma queda sem perder mensagens.
Hoje o MQTT é um padrão da OASIS, e a versão 3.1.1 foi ainda adotada como norma internacional ISO/IEC 20922. Ele há muito superou a indústria do petróleo: casas conectadas, medidores, máquinas-ferramenta, carros e equipamentos médicos funcionam com ele.
O custo extra mínimo por mensagem é de dois bytes. Uma única requisição HTTP, em comparação, gasta centenas de bytes só em cabeçalhos, antes de qualquer conteúdo. Quando um dispositivo relata uma temperatura a cada segundo por um modem celular no meio do campo, essa diferença decide o projeto.
Como funciona: publicar, assinar e o broker
No HTTP o cliente pergunta e o servidor responde. No MQTT ninguém pergunta nada a ninguém: um dispositivo publica uma mensagem em um tópico, e todos os que assinaram esse tópico a recebem. O emissor não sabe quem lê, nem se alguém lê; o destinatário não sabe quem enviou. A única coisa que os une é o nome do tópico.
No meio há sempre um broker — um servidor que mantém as conexões, guarda a árvore de assinaturas e distribui as mensagens. Sem ele o modelo não funciona: o broker é o que transforma «enviado ao vazio» em «entregue a todos que precisam».
O que o broker faz
- Aceita e mantém conexões — milhares ao mesmo tempo, por anos sem interrupção.
- Verifica quem está se conectando: usuário e senha, um certificado ou um token.
- Decide o que cada cliente pode fazer: as permissões de publicar e assinar são concedidas por tópico.
- Compara cada mensagem publicada com a árvore de assinaturas e distribui as cópias.
- Guarda estado: últimos valores conhecidos (retain), filas para clientes ausentes e confirmações pendentes.
- Acompanha quem está vivo e publica o testamento de quem desaparece.
Desacoplar emissor e destinatário não é um detalhe técnico, e sim o ponto central do modelo. Você pode trocar um sensor, acrescentar um segundo consumidor ou pendurar uma análise ao lado sem reescrever nada: todos conversam com um tópico, não entre si.
Tópicos e curingas
Um tópico é uma cadeia de níveis separados por barras. Nada precisa ser registrado de antemão: publicar em um tópico novo o cria na hora.
escritorio/andar2/sala14/temperatura
escritorio/andar2/sala14/umidade
escritorio/andar2/sala15/temperatura
Uma assinatura pode capturar ramos inteiros com dois curingas:
| Curinga | Significado | Exemplo | O que captura |
|---|---|---|---|
+ | exatamente um nível | escritorio/andar2/+/temperatura | a temperatura de cada sala do segundo andar |
# | tudo abaixo, incluindo este nível | escritorio/# | todos os tópicos do escritório |
O curinga # só vale como último nível: escritorio/#/temperatura não é um filtro válido. Os tópicos diferenciam maiúsculas de minúsculas, e escritorio/andar2 e escritorio/andar2/ são dois tópicos distintos.
$ são reservados ao próprio servidor — normalmente $SYS, que carrega as estatísticas do broker. Os curingas não os alcançam: assinar # não mostrará $SYS, que exige um filtro explícito.Qualidade de serviço: QoS 0, 1 e 2
O MQTT deixa você escolher quanto esforço gastar na entrega de cada mensagem. O nível é definido separadamente ao publicar e ao assinar; vale o menor dos dois.
| Nível | Garantia | Como funciona | Quando serve |
|---|---|---|---|
| QoS 0 | no máximo uma vez | envie e esqueça, sem confirmação | telemetria frequente, em que a próxima leitura chega um segundo depois de qualquer forma |
| QoS 1 | pelo menos uma vez | o destinatário responde PUBACK; silêncio significa reenviar | eventos que não se pode perder, mas que podem aparecer duas vezes |
| QoS 2 | exatamente uma vez | um handshake de quatro pacotes que descarta duplicatas | comandos e cobrança, em que uma repetição é um defeito |
O custo sobe com a garantia: QoS 2 são quatro pacotes em vez de um, mais estado nas duas pontas. Resista à vontade de «usar 2 em tudo por precaução»: dez mil sensores publicando a cada segundo em QoS 2 carregam um broker uma ordem de grandeza mais, sem ganho algum.
Retain, Last Will, sessões e keep-alive
Retain — o último valor conhecido
Uma mensagem comum só alcança quem estiver assinando naquele momento. Uma mensagem com a marca retain é ainda lembrada pelo broker e entregue a cada novo assinante no instante em que ele assina. É a resposta padrão ao eterno problema do painel que abre vazio e assim permanece até um sensor se dignar a enviar a próxima leitura.
Um tópico guarda exatamente uma mensagem retida: a última. Para limpá-la, publique um payload vazio no mesmo tópico com a marca retain.
Last Will — uma mensagem para quando o enlace cai
Ao se conectar, um cliente pode entregar ao broker um testamento: um tópico, um payload e suas opções. Se a conexão morrer sem cerimônia — sem pacote DISCONNECT —, o broker publica essa mensagem em nome dele. O padrão clássico é um tópico retido device/42/status que recebe online ao conectar e traz offline como testamento. O sistema sempre sabe quem está presente, sem qualquer sondagem.
Sessões: limpas e persistentes
Uma sessão limpa dura exatamente o tempo da conexão: ao desconectar, as assinaturas são esquecidas. Uma persistente sobrevive à queda: o broker lembra as assinaturas e enfileira as mensagens QoS 1 e 2 enquanto o cliente está fora, entregando o acumulado quando ele volta. Para um dispositivo que acorda uma vez por hora, é a única forma de não perder nada.
Keep-alive — perceber que o enlace morreu
Uma conexão TCP rompida pode parecer perfeitamente viva nas duas pontas por muito tempo. Por isso o cliente declara um intervalo de keep-alive e, sem nada mais a dizer, envia um ping. Sem ouvir nada por um intervalo e meio, o broker dá o cliente por desaparecido, fecha a conexão e publica o testamento dele.
As versões: 3.1, 3.1.1 e 5.0
Na prática aparecem três versões, e as diferenças não são cosméticas.
| Versão | Ano | Situação | O que importa |
|---|---|---|---|
| MQTT 3.1 | 2010 | obsoleta | a especificação da IBM; identificadores de cliente limitados a 23 caracteres; hoje não há motivo para escolhê-la |
| MQTT 3.1.1 | 2014 | padrão OASIS, ISO/IEC 20922 | a versão mais difundida; praticamente tudo a suporta |
| MQTT 5.0 | 2019 | padrão OASIS | uma revisão profunda: propriedades de pacote, códigos de motivo, assinaturas compartilhadas |
À parte fica o MQTT-SN, um protocolo irmão para redes sem TCP: ZigBee, enlaces de rádio, UDP. Não é «uma versão do MQTT», e sim uma especificação própria; essas redes ganham um gateway que traduz o tráfego para MQTT comum.
O que o MQTT 5.0 realmente traz
A versão 5 nasceu de incômodos acumulados na prática. O que tem mais peso:
- Códigos de motivo. No 3.1.1 uma recusa parecia um socket fechado em silêncio, e restava adivinhar. No 5.0 o servidor diz o que houve: senha errada, sem permissão para aquele tópico, pacote grande demais.
- Propriedades de pacote. Uma mensagem pode carregar metadados:
Content Type,Correlation Data, pares chave-valor próprios. Antes tudo isso era enfiado no payload ou no nome do tópico. - Requisição e resposta. Os campos
Response TopiceCorrelation Datatornam o RPC comum um padrão de primeira classe, em vez de uma convenção improvisada. - Assinaturas compartilhadas via
$share/grupo/filtro: várias instâncias de um consumidor dividem o fluxo. Isso é balanceamento de carga e tolerância a falhas no próprio protocolo. - Tempos de vida de sessões e mensagens.
Session ExpiryeMessage Expirypermitem dizer «guarde por um dia e depois esqueça» em vez da escolha binária entre limpa e não limpa. - Controle de fluxo.
Receive Maximumlimita quantas mensagens sem confirmação viajam ao mesmo tempo, eMaximum Packet Sizeprotege um dispositivo pequeno de um pacote que ele não consegue digerir. - Aliases de tópicos. Um nome longo é enviado uma vez e depois substituído por um número de dois bytes — uma economia real em hierarquias profundas.
- Identificadores de assinatura, No Local, Retain As Published, Retain Handling. Detalhes que eliminam armadilhas antigas: ouvir o eco das próprias mensagens, uma avalanche de retidas a cada reconexão, não saber por qual assinatura uma mensagem chegou.
- Testamento adiado. O
Will Delay Intervalevita que uma oscilação momentânea dispare um alarme: o testamento só é publicado se o cliente não voltar a tempo.
A conclusão prática: comece projetos novos no 5.0. Assinaturas compartilhadas e códigos de erro compreensíveis poupam semanas de depuração, e a compatibilidade com dispositivos antigos não se perde.
MQTT diante do HTTP e das alternativas
«Para que MQTT se existe REST?» é uma pergunta justa. A diferença não é moda, e sim o sentido e o custo de uma conversa.
| MQTT | HTTP / REST | |
|---|---|---|
| Modelo | publicar e assinar, muitos para muitos | requisição e resposta, um para um |
| Quem começa | os dois lados: o servidor pode enviar a qualquer momento | só o cliente; o servidor cala até ser perguntado |
| Conexão | uma só, de longa duração | normalmente uma nova por requisição |
| Custo extra | a partir de 2 bytes | centenas de bytes de cabeçalhos |
| Saber de uma mudança | ela chega sozinha | consultar de tempos em tempos |
| Comportamento na queda | filas, reenvios, retain, um testamento | a requisição simplesmente falha |
| Melhor em | telemetria, comandos, eventos | documentos, arquivos, integrações, a web |
A consulta periódica deixa isso claro. Para saber de um evento em menos de um segundo por HTTP, mil dispositivos precisam perguntar mil vezes por segundo, e quase toda resposta será «nada de novo». No MQTT o evento chega sozinho no instante em que acontece e, nesse meio-tempo, não consome tráfego.
E quanto a CoAP, AMQP e WebSocket
- CoAP é REST sobre UDP para nós muito pequenos. Mais leve que o MQTT, mas não oferece filas nem entrega confiável sem esforço.
- AMQP é mais pesado e mais rico: roteamento elaborado, transações, filas de nível corporativo. Faz sentido entre servidores, é excessivo para um sensor.
- WebSocket é um transporte, não uma alternativa: o próprio MQTT roda sobre WebSocket para funcionar dentro de um navegador.
- Sparkplug B não é rival, e sim uma camada sobre o MQTT: ele dita como nomear tópicos e codificar payloads em sistemas industriais, para que softwares SCADA de fabricantes diferentes entendam os mesmos dados.
Transporte, portas e payloads
O MQTT roda sobre TCP e pede apenas entrega confiável e ordenada. As portas de praxe:
| Porta | O que é |
|---|---|
1883 | MQTT sobre TCP, sem criptografia |
8883 | MQTT sobre TLS — a porta padrão de uma conexão protegida |
80 / 443 | MQTT sobre WebSocket: muitas vezes a única saída de um navegador ou através de um firewall corporativo rígido |
Para o protocolo, um payload é apenas uma sequência de bytes. O MQTT nada sabe do conteúdo e nada impõe: JSON, CBOR, protobuf, um simples número ou uma imagem servem igualmente. O limite formal é de 256 MB, mas na prática tudo acima de algumas centenas de kilobytes pertence ao HTTP, viajando pelo MQTT apenas um link.
Na prática o JSON domina: uma pessoa consegue lê-lo, qualquer linguagem o interpreta e ele é compacto o bastante. Em um enlace estreito, um formato binário ganha seu espaço — e é exatamente aí que a propriedade Content Type do MQTT 5.0 ajuda, dizendo com honestidade o que há dentro.
Segurança
O MQTT nada criptografa por si só: na porta 1883 o usuário e a senha trafegam em texto puro. A segurança vem de três camadas independentes, e nenhuma delas é opcional.
Criptografar o canal
TLS na porta 8883. Para dispositivos fracos demais para TLS, a única opção decente é mantê-los em uma rede isolada e não deixar nada sair a não ser por um gateway.
Autenticação
O clássico é usuário e senha no pacote CONNECT. Mais rígido: certificados de cliente, com o dispositivo apresentando o seu e o broker conferindo a assinatura. Mais flexível: JWT, em que o dispositivo traz um token assinado e com prazo, e revogar o acesso não exige mexer no broker. Bons brokers também sabem ler contas de um banco externo, de um arquivo CSV ou de um serviço HTTP, para que a lista de dispositivos não precise existir em duplicata.
Permissões por tópico
A autenticação responde «quem é você»; a autorização, «o que você pode fazer». As listas de controle de acesso dizem quais tópicos um cliente pode ler e quais pode escrever. O ajuste correto é negar tudo, exceto o explicitamente permitido.
#. Basta alguém extrair uma imagem do firmware para que um atacante veja todo o tráfego do sistema e possa comandar qualquer dispositivo nele. Confine cada dispositivo ao próprio ramo: device/{id}/# e nada além.A isso somam-se limites de taxa de publicação (para que um único dispositivo enlouquecido não soterre o broker), um tamanho máximo de pacote e a higiene de rede de sempre: o painel do broker não tem o que fazer voltado para a internet aberta.
Onde o MQTT é realmente usado
Casa conectada e automação predial
O maior campo em volume. Home Assistant, Zigbee2MQTT, ESPHome e openHAB conversam por meio de um broker MQTT, que ainda faz o papel de cola entre equipamentos de fabricantes diferentes: uma tomada, um sensor de vazamento e um controlador de aquecimento de três marcas cooperam perfeitamente, porque cada um simplesmente escreve no próprio tópico.
Indústria e SCADA
Leituras de máquina, estado da linha, contadores de horas. O arranjo clássico é um gateway que lê Modbus ou OPC UA do equipamento e republica por MQTT, depois do que SCADA, um historiador e um sistema de manutenção preditiva consomem tudo ao mesmo tempo sem atrapalhar uns aos outros. É aqui que o Sparkplug B e as assinaturas compartilhadas do MQTT 5.0 ganham seu lugar.
Medição e concessionárias
Medidores de água, gás, energia e calor: dispositivos a bateria que acordam uma vez por hora, informam uma leitura e voltam a dormir. Aqui as sessões persistentes e o retain fazem o trabalho pesado — o servidor sempre vê o último valor mesmo que um medidor só se manifeste à noite.
Transporte e telemática
Coordenadas, consumo de combustível, estado do baú refrigerado, comportamento do motorista. O enlace é uma rede celular que some em túneis e fora da cidade. Filas e reenvio após a reconexão transformam uma conexão em farrapos num fluxo contínuo de dados.
Energia, agricultura, saúde
Usinas solares e subestações, sistemas de irrigação e estações meteorológicas, monitores de pacientes e geladeiras de vacinas. O que têm em comum: muitos pontos, um enlace fraco, eventos que não podem se perder e a necessidade de saber de uma falha imediatamente.
Cidades inteligentes e logística
Iluminação pública, estacionamento, contêineres que informam o quanto estão cheios, rastreamento de carga e temperatura da cadeia de frio. Dezenas de milhares de dispositivos enviando mensagens curtas e espaçadas — exatamente o perfil de carga para o qual o MQTT foi projetado.
Projetar seus tópicos: decisões que valem cedo
Seu esquema de tópicos é a API do seu sistema. Mudá-lo depois dói, porque firmware e servidor precisam ser atualizados em conjunto. Algumas regras que poupam tempo.
- Do geral ao específico.
fabrica/galpao3/linha2/maquina7/temperaturapermite assinar em qualquer nível. A ordem inversa torna os curingas inúteis. - Dê ao identificador do dispositivo um nível próprio. É isso que permite a uma única regra de ACL confinar um dispositivo ao seu ramo.
- Sem barra inicial.
/escritorio/tempcria um primeiro nível vazio — válido, mas fonte duradoura de confusão. - Só letras latinas, dígitos, hífen e sublinhado. Espaços e os caracteres
+,#e$em nomes provocam falhas que ninguém espera. - Nunca codifique dados variáveis no tópico.
sensor/42/temp/21.5é um erro: o valor vai no payload, senão o broker acaba com uma árvore de tópicos sem limite e o retain deixa de servir. - Separe estado de comandos. Por exemplo
device/42/statepara o que o dispositivo informa edevice/42/cmdpara o que se manda a ele. Caso contrário, o eco dos próprios comandos acabará realimentando a lógica. - Retain para estado, não para telemetria. O retain serve para o «último estado conhecido» e não faz sentido para um fluxo de leituras.
v1 no início do tópico não custa nada hoje e, daqui a dois anos, permitirá lançar um novo formato de payload sem quebrar um parque de dispositivos antigos.Escolher um broker
Há muitos brokers, e a escolha em geral se resume a um punhado de perguntas.
- O MQTT 5.0 é suportado por inteiro? Suporte parcial é comum, e costuma-se descobrir isso no pior momento possível.
- Dá para ver o que está acontecendo? Poder observar quem está conectado, quais tópicos têm vida e o que passa agora poupa horas de depuração. Um broker sem painel transforma cada problema em arqueologia de logs.
- Como os dispositivos são cadastrados? Com milhares deles, fazer à mão está fora de questão — é preciso uma API ou contas em um banco externo.
- Ele sobrevive a uma reinicialização? Mensagens retidas, sessões persistentes e filas precisam chegar ao disco, senão uma reinicialização planejada significa perder dados.
- Que limites existem? Um dispositivo enlouquecido não pode derrubar o sistema: limites de taxa e de volume importam.
- Quanto custa e onde roda? Um serviço em nuvem é cômodo até começar a cobrar por mensagem; um servidor próprio precisa ser administrado, mas mantém os dados com você.
Para uma instalação pequena ou média — de uma casa conectada a uma fábrica com alguns milhares de pontos — normalmente basta um único broker em uma máquina modesta. Cluster é necessário bem menos vezes do que parece durante o projeto; mais vezes compensa ligar dois brokers independentes com uma ponte que encaminhe apenas os tópicos que importam.
Começar em cinco minutos
O jeito mais rápido de entender tudo isso é subir um broker e observar as mensagens você mesmo. No Debian ou no Ubuntu são três comandos:
sudo wget -qO /usr/share/keyrings/elx-repo.gpg https://repo.um-d.ru/elx-repo.gpg
echo "deb [signed-by=/usr/share/keyrings/elx-repo.gpg] https://repo.um-d.ru stable main" | sudo tee /etc/apt/sources.list.d/elx-repo.list
sudo apt-get update && sudo apt-get install elxmqttbroker
O painel abre em http://seu-servidor:8567. Crie um usuário e experimente a troca com qualquer cliente — as ferramentas de console do mosquitto, por exemplo:
# em uma janela — assinar tudo o que o dispositivo envia
mosquitto_sub -h localhost -u sensor-42 -P senha -t 'sensor-42/#' -v
# em outra — publicar uma leitura
mosquitto_pub -h localhost -u sensor-42 -P senha -t 'sensor-42/temp' -m '21.5'
# o mesmo, mas lembrado para os futuros assinantes
mosquitto_pub -h localhost -u sensor-42 -P senha -t 'sensor-42/temp' -m '21.5' -r
Depois disso, brinque com a marca retain, desconecte um assinante e veja o que se acumula em uma sessão persistente, coloque um testamento e puxe o cabo. Meia hora disso ensina mais que qualquer artigo, este incluído.
Respostas rápidas
O que é MQTT em termos simples?
É um jeito de os dispositivos trocarem mensagens curtas por meio de um intermediário. Um dispositivo envia uma mensagem a um «tópico» com nome, e todo programa que assinou esse tópico a recebe na hora. Emissor e destinatário nada sabem um do outro, e é isso que permite mudar ou acrescentar qualquer um dos dois de forma independente.
Para que preciso de um broker MQTT?
O broker é o servidor que mantém as conexões com todos os dispositivos, verifica as permissões deles, compara as mensagens publicadas com as assinaturas e distribui as cópias. O MQTT não funciona sem ele: publicar e assinar se encontram dentro do broker.
Em que o MQTT 5.0 difere do 3.1.1?
Sobretudo: códigos de motivo compreensíveis em vez de uma conexão fechada em silêncio, propriedades de pacote carregando metadados, requisição e resposta como padrão de primeira classe, assinaturas compartilhadas para dividir a carga entre consumidores, tempos de vida controláveis de sessões e mensagens, controle de fluxo e aliases de tópicos que economizam banda.
Vale a pena migrar para o MQTT 5.0?
Para projetos novos, sim — os ganhos são reais e a compatibilidade se mantém. Um sistema 3.1.1 existente não precisa de migração urgente: as duas versões funcionam ao mesmo tempo no mesmo broker, então os dispositivos podem ser trocados aos poucos, conforme o firmware for atualizado.
Qual QoS devo usar?
QoS 0 para telemetria frequente, em que perder uma leitura não importa. QoS 1 para eventos que não se pode perder, desde que o destinatário saiba descartar duplicatas. QoS 2 só para comandos e cobrança, em que reprocessar é inaceitável. Colocar QoS 2 em tudo «por precaução» é o jeito mais fácil de sobrecarregar um broker.
O que significa retain no MQTT?
É uma marca que manda o broker lembrar uma mensagem e entregá-la a cada novo assinante no momento em que ele assina. Por tópico guarda-se apenas a última dessas mensagens. É a resposta padrão a «mostre o estado atual já, em vez de esperar a próxima atualização do sensor». Ela se apaga publicando um payload vazio com a mesma marca.
O que é um Last Will?
Uma mensagem que o cliente entrega ao broker ao se conectar e que o broker publica em nome dele se a conexão morrer sem uma desconexão limpa. Costuma ser usada para marcar um dispositivo como offline, de modo que o sistema saiba da perda sem sondagens.
O MQTT é seguro?
O protocolo nada criptografa por si só: na porta 1883 a senha trafega em texto puro. A segurança vem do TLS na porta 8883, da autenticação por senha, certificado ou JWT, e de listas de acesso por tópico que funcionam negando tudo o que não for explicitamente permitido.
Quantos dispositivos um broker aguenta?
Depende do broker e da carga, mas como ordem de grandeza: um único processo em um servidor comum sustenta com folga dezenas de milhares de conexões simultâneas com telemetria típica. O limite normalmente não é o número de dispositivos, e sim a taxa de mensagens e o QoS exigido.
O MQTT funciona no navegador?
Sim, por MQTT sobre WebSocket. Navegadores não podem abrir conexões TCP arbitrárias, então o protocolo é embrulhado em um WebSocket — o que permite a um painel web assinar tópicos diretamente, sem servidor intermediário.
O que significam + e # nos tópicos?
São curingas de assinatura. O + substitui exatamente um nível do tópico; o # cobre todos os níveis restantes e só vale no fim de um filtro. Não se pode publicar em um tópico com curingas — eles servem apenas para assinar.
Por que o MQTT é melhor que o HTTP para a internet das coisas?
Ele dispensa consultas periódicas: a mensagem chega sozinha quando o evento acontece. O custo extra começa em dois bytes em vez de centenas, a conexão é única e duradoura, e filas, reenvios e retain levam o sistema através de uma queda sem perder dados. Para relatórios, arquivos e integrações, o HTTP continua sendo a melhor ferramenta.