MQTT
MQTT é o transporte mais comum entre o chão de fábrica e o mundo corporativo: um broker no meio, publicadores de um lado, assinantes do outro. O CMS fala os dois papéis, e sobre a mesma conexão também fala Sparkplug B — a especificação que padroniza o que o MQTT deixa em aberto.
| Coleta | Entrega | |
|---|---|---|
| MQTT puro | MQTT_TOPIC_SUBSCRIBER — assina um tópico | MQTT_PUBLISH — publica num tópico |
| Sparkplug B | SPARKPLUG_SUBSCRIBER — assina um recorte do namespace | SPARKPLUG_CMD — envia NCMD / DCMD |
Conexão
Cadastre um MQTT Broker em Conexões Externas:
| Campo | Observação |
|---|---|
| Protocolo | mqtt, mqtts, ws ou wss — WebSocket resolve broker atrás de proxy corporativo |
| Host e porta | Padrão 1883 (ou 8883 com TLS) |
| Usuário e senha | Opcionais, conforme o broker |
| TLS | Liga a conexão cifrada |
| Prefixo do Client ID | Entra no início do identificador de cada conexão |
| Sparkplug B | Marca que este broker carrega um namespace spBv1.0 |
Use Testar conexão antes de criar a Coleta: um broker que recusa a credencial falha aqui, com a mensagem do broker, em vez de falhar em silêncio depois.
O prefixo do Client ID existe por uma razão prática: brokers desconectam clientes com IDs
iguais. O CMS monta o Client ID como {prefixo}-{id da coleta}-{timestamp}, o que garante
unicidade mesmo com várias Coletas no mesmo broker e com reconexões seguidas.
Marcar Sparkplug B na conexão é uma característica do broker, não de cada Coleta: ligado, as telas de Coleta e Entrega passam a oferecer os tipos Sparkplug.
Coleta — MQTT_TOPIC_SUBSCRIBER
O CMS assina um tópico e reage a cada publicação. Não há agendamento: é orientado a evento, como o SAP IDoc e o trigger OPC UA.
| Campo | Papel |
|---|---|
| Tópico | O filtro de assinatura. Aceita curingas do MQTT: + (um nível) e # (o resto) |
| QoS | 0, 1 ou 2, conforme a garantia que o broker oferece |
Cada mensagem publicada vira uma mensagem no CMS, com o payload cru, encaminhada para as interfaces de destino configuradas.
Detalhes que evitam surpresa
- A conexão é por Coleta. Duas Coletas no mesmo broker abrem duas conexões, com Client IDs distintos. Isso mantém uma independente da outra: reconfigurar uma não derruba a outra.
- Reconexão automática a cada 5 segundos, com keepalive de 15 segundos. O estado (conectado / reconectando / desconectado) aparece na tela da Coleta.
- Bytes nulos são removidos do payload antes de gravar. Payload MQTT é binário, e um byte
NULno meio faria o banco recusar o registro inteiro. - Erro de Negócio é avaliado no recebimento, sobre o texto em claro, antes de qualquer criptografia de payload. Uma regra de saída que case aqui marca a mensagem como Erro Negócio já na chegada.
Configure o alerta Conexão Perdida (CONEXAO_MQTT_PERDIDA) para toda Coleta MQTT. Uma
assinatura caída é silenciosa: não gera erro, apenas para de chegar mensagem — o modo de falha mais
difícil de perceber. Ver Alertas.
Escolher o tópico
O curinga é tentador e tem custo. fabrica/# traz tudo, inclusive o que você não quer, e cada
publicação vira uma mensagem gravada. Prefira o recorte mais estreito que resolva o caso, e use o
Transformador para descartar o que não interessa só quando o filtro de tópico não der conta.
Quando a origem publica várias grandezas em tópicos irmãos (.../temp, .../pressao), + no nível
certo costuma ser melhor que #: o tópico de origem chega ao Transformador em contexto.topico, e é
por ele que o script sabe qual grandeza está tratando.
Entrega — MQTT_PUBLISH
Publica o payload num tópico do broker. Útil para devolver resultado ao chão de fábrica, alimentar um supervisório ou outro consumidor da planta.
| Campo | Papel |
|---|---|
| Tópico | Aceita {{alias}} resolvido contra o payload — inclusive caminho aninhado ({{equipamento.id}}) |
| QoS | 0 (no máximo uma vez) ou 1 (pelo menos uma vez) |
O tópico dinâmico é o que permite uma única Entrega publicar em sensores/{{idSensor}}/comando, com
o destino saindo do próprio conteúdo da mensagem.
Declare os aliases usados no tópico como Payload de Entrada da Entrega. Marcados como
obrigatórios, uma mensagem sem o campo é recusada com mensagem clara — em vez de publicar num
tópico com undefined no meio.
Testar sem broker de produção
O repositório traz um broker Mosquitto no docker-compose.test.yml, o ambiente de teste:
docker compose -f docker-compose.test.yml up -d mosquittoEle serve tanto para MQTT puro quanto para Sparkplug B — que traz também um simulador de edge node.
Sparkplug B
Se o outro lado fala Sparkplug (Ignition, HiveMQ Edge, Kepware, Cirrus Link, Opto 22), a página a seguir cobre o namespace, o ciclo de vida BIRTH/DEATH, a descoberta de métricas e os comandos.