Levar um projeto MQTT do protótipo à produção é, em grande parte, fechar as lacunas que uma demo pode ignorar: quem pode se conectar, quem pode ler os dados, como os topics são organizados e como você descobre quando algo quebra. Este guia leva um projeto pessoal típico do servidor MQTT público a um broker privado, protegido por TLS, com um namespace limpo e monitoramento básico, na ordem que gera menos retrabalho.
O Ponto de Partida: Um Protótipo Funcionando
A maioria dos projetos MQTT começa do mesmo jeito. Um sensor ou um ESP32 publica JSON no servidor MQTT público, um notebook roda mosquitto_sub ou um flow do Node-RED, e os dados aparecem. Um protótipo típico se parece com isto:
mosquitto_pub -h broker.connectmq.com -p 1883 -i proto-dev-x9f3 \
-t "connectmq/demo/x9f3/temp" -m '{"c":22.1}'
É uma ótima forma de começar. E também não é produção, por cinco motivos:
- Sem autenticação. Qualquer um pode se conectar; o servidor MQTT público broker.connectmq.com é legível por todos.
- Sem criptografia. A porta 1883 envia credenciais e payloads em texto puro.
- Topics improvisados. A árvore de topics cresceu de forma orgânica e não vai sobreviver a mais do que alguns dispositivos.
- Sem presença. Você não consegue distinguir um dispositivo offline de um silencioso.
- Sem visibilidade. Quando os dados param, você descobre porque um gráfico ficou plano.
Os passos abaixo fecham cada lacuna, uma de cada vez.
Passo 1: Migre para Credenciais Privadas
Crie uma conta em app.connectmq.com, escolha um plano, crie um broker e copie o username, a senha e o client ID gerados. O plano Serverless gratuito é suficiente para um piloto de até 25 conexões; o plano Serverless pago eleva isso para 1.000 e adiciona QoS 2, mensagens de 1 MB e shared subscriptions.
Duas regras tornam o resto da migração indolor:
- Um conjunto de credenciais por dispositivo ou serviço. Os client IDs são vinculados às credenciais emitidas, então compartilhar um conjunto entre dois dispositivos faz com que um desconecte o outro.
- Mantenha as credenciais fora do controle de versão. Carregue-as de variáveis de ambiente, de um arquivo de segredos excluído do git ou de uma etapa de provisionamento na fábrica.
# .env (nunca faça commit deste arquivo)
MQTT_HOST=broker.connectmq.com
MQTT_PORT=8883
MQTT_USERNAME=YOUR_USERNAME
MQTT_PASSWORD=YOUR_PASSWORD
MQTT_CLIENT_ID=YOUR_CLIENT_ID
Passo 2: Ative o TLS em Todo Lugar
O tráfego de produção deve usar TLS na porta 8883 para dispositivos e Secure WebSocket na porta 8084, com o caminho /mqtt, para navegadores. A ConnectMQ usa um certificado Let's Encrypt, então a maioria dos sistemas operacionais e runtimes de linguagens já confia nele. Em microcontroladores, normalmente você embute o certificado ISRG Root X1; nosso guia de MQTT com SSL no ESP32 mostra os detalhes.
Aqui está o publicador do protótipo reescrito para produção em Python com paho-mqtt 2.x. Ele lê as credenciais do ambiente, conecta via TLS com MQTT 5, define um Last Will para que o broker possa anunciar desconexões inesperadas e publica um status online retido.
import json
import os
import time
import paho.mqtt.client as mqtt
from paho.mqtt.properties import Properties
from paho.mqtt.packettypes import PacketTypes
HOST = os.environ["MQTT_HOST"]
PORT = int(os.environ.get("MQTT_PORT", "8883"))
CLIENT_ID = os.environ["MQTT_CLIENT_ID"]
BASE = "acme/site1/greenhouse/zone2/sensor-01" # namespace de produção
def on_connect(client, userdata, flags, reason_code, properties):
if reason_code.is_failure:
print("connect failed:", reason_code)
return
print("connected")
client.publish(f"{BASE}/status", "online", qos=1, retain=True)
def on_disconnect(client, userdata, flags, reason_code, properties):
print("disconnected:", reason_code)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
client_id=CLIENT_ID, protocol=mqtt.MQTTv5)
client.username_pw_set(os.environ["MQTT_USERNAME"], os.environ["MQTT_PASSWORD"])
client.tls_set()
client.will_set(f"{BASE}/status", "offline", qos=1, retain=True)
client.reconnect_delay_set(min_delay=1, max_delay=60)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
connect_props = Properties(PacketTypes.CONNECT)
connect_props.SessionExpiryInterval = 3600 # mantém a sessão por uma hora offline
client.connect(HOST, PORT, keepalive=60, properties=connect_props)
client.loop_start()
try:
while True:
reading = {"ts": int(time.time()), "temp_c": 22.1, "rh": 61}
client.publish(f"{BASE}/telemetry", json.dumps(reading), qos=1)
time.sleep(30)
except KeyboardInterrupt:
client.publish(f"{BASE}/status", "offline", qos=1, retain=True).wait_for_publish()
client.disconnect()
client.loop_stop()
Repare como pouco mudou em relação ao protótipo: hostname, porta, credenciais, TLS e algumas propriedades. Esse é o objetivo de usar MQTT padrão de ponta a ponta.
Passo 3: Projete um Namespace de Topics para Produção
Um topic de protótipo como connectmq/demo/x9f3/temp funciona para um sensor. Um namespace de produção precisa sobreviver a novos sites, novos tipos de dispositivo e novos consumidores sem renomear nada. Uma boa estrutura vai do geral para o específico e separa dados de comandos e de status.
| Nível | Exemplo | Finalidade |
|---|---|---|
| Organização ou tenant | acme |
Isola clientes ou unidades de negócio |
| Site | site1 |
Local físico |
| Área | greenhouse |
Prédio, linha ou sala |
| Unidade | zone2 |
Grupo lógico de dispositivos |
| Dispositivo | sensor-01 |
Identificador estável do dispositivo |
| Classe de mensagem | telemetry, status, cmd, cmd/ack |
O que a mensagem é |
Regras práticas que evitam dor de cabeça depois:
- Mantenha os níveis em minúsculas, sem espaços e sem barra inicial.
- Coloque o ID do dispositivo no topic, não apenas no payload, para que os assinantes possam filtrar com curingas.
- Use um ramo
cmdseparado para comandos, para que os dispositivos assinem de forma restrita. - Torne os topics de status retidos, para que assinantes tardios vejam o estado atual imediatamente.
- Mantenha uma profundidade razoável; o servidor MQTT público permite 8 níveis, um orçamento sensato em qualquer lugar.
Se o seu projeto é industrial, como uma planta em Joinville ou uma mineradora, considere alinhar com os níveis ISA-95 desde o início. A visão de dispositivos da ConnectMQ agrupa os clients por níveis ISA-95 quando seus topics seguem esse padrão, e um namespace assim facilita alimentar mais tarde um gêmeo digital da planta. Nosso guia de estrutura de topics MQTT para casa inteligente cobre projetos residenciais.
Passo 4: Rastreie a Presença dos Dispositivos
Mensagens de status online e offline retidas com um Last Will, como no código acima, dão a todo assinante uma visão confiável de quais dispositivos estão conectados. Você também pode acompanhar o estado do lado do broker por $SYS/broker/connection/{clientId}/state, útil para um serviço de backend que precisa saber quando um client específico cai.
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-u YOUR_USERNAME -P YOUR_PASSWORD -i YOUR_CLIENT_ID -V mqttv5 \
-t 'acme/site1/+/+/+/status' -v
Passo 5: Adicione Monitoramento e Alertas
Produção significa que alguém descobre os problemas antes dos usuários. Comece simples:
- Use o dashboard do portal e o explorador de topics ao vivo para confirmar que os dados estão fluindo após cada implantação.
- Crie regras de alerta por limite para os valores que importam, como uma temperatura fora da faixa, e revise o log de alertas.
- Registre os reason codes do MQTT 5 em todos os clients, para que problemas de cota e de autorização possam ser diagnosticados.
- Se você precisa de armazenamento de longo prazo ou notificações personalizadas, rode o seu próprio assinante, por exemplo um serviço Python, o Telegraf ou o Node-RED, que se conecta ao broker como um client MQTT comum e grava no seu banco de dados ou ferramenta de mensagens.
Para uma lista mais completa, leia nosso guia de monitoramento de broker MQTT.
Checklist de Prontidão para Produção
Antes de lançar, confirme cada item:
- Cada dispositivo e serviço tem as suas próprias credenciais e client ID.
- Todas as conexões usam TLS (8883) ou Secure WebSocket (8084).
- Nenhuma credencial fica no controle de versão do firmware.
- O namespace de topics está documentado e começa com um nível de organização ou tenant.
- Os dispositivos publicam status retido com um Last Will.
- A lógica de reconexão usa backoff exponencial com jitter.
- Os payloads ficam bem abaixo do limite de tamanho de mensagem do plano.
- Os comandos usam pelo menos QoS 1 e podem ser recebidos duas vezes com segurança.
- Você tem um plano de atualização de firmware que rotaciona credenciais.
- Os alertas chegam a uma pessoa quando valores-chave ou a presença dos dispositivos mudam.
Com a lista concluída, o checklist de produção MQTT e as boas práticas de segurança MQTT vão além no hardening.
Como Escolher o Plano Certo para Produção
Comece com o menor plano que cubra o seu número de conexões com folga. Passe para o Serverless pago quando precisar de mais de 25 conexões, QoS 2, mensagens maiores ou shared subscriptions para consumidores de backend. Escolha o Dedicated quando quiser um cluster isolado, o BYOC quando o broker precisar rodar na sua própria conta de nuvem e o Self Managed Enterprise quando precisar operá-lo você mesmo. O guia de broker MQTT na nuvem compara esses modelos de hospedagem com mais profundidade.
Leve Seu Protótipo à Produção com a ConnectMQ
A ConnectMQ, um broker MQTT gerenciado, oferece credenciais privadas, TLS, MQTT 5 e um portal com explorador de topics ao vivo e regras de alerta, sobre o mesmo MQTT padrão que o seu protótipo já fala. Cadastre-se em app.connectmq.com, crie um broker no plano Serverless gratuito, sem cartão de crédito, e aponte o seu protótipo para ele em minutos. Se preferir não operar nenhuma infraestrutura, um broker MQTT gerenciado é o caminho mais curto.
Perguntas frequentes
Posso continuar usando o servidor MQTT público em produção?
Não. O servidor MQTT público broker.connectmq.com é legível por todos e tem limites apertados por client, então serve apenas para testes. Dados de produção pertencem a um broker privado com credenciais e TLS.
Preciso mudar o código dos dispositivos para ir à produção?
Normalmente só mudam as configurações de conexão: hostname, porta 8883, credenciais e TLS. Os nomes dos topics mudam se você adotar um novo namespace, o que vale a pena fazer antes de escalar.
Como devo lidar com credenciais em muitos dispositivos?
Emita um conjunto de credenciais por dispositivo, carregue-o durante o provisionamento em vez de compilá-lo em um firmware compartilhado e mantenha um registro para poder revogar um único dispositivo sem mexer nos outros.
Qual plano um pequeno piloto deve usar?
Um piloto com até 25 conexões simultâneas cabe no plano Serverless gratuito. Passe para o Serverless pago quando precisar de mais conexões, QoS 2 ou mensagens maiores.



