IoT industrial

Solicitações de Rebirth no Sparkplug: Quando e Como Dispará-las

Um rebirth do Sparkplug faz um edge node republicar os seus births para que o host reconstrua uma visão precisa. Este guia de solução de problemas cobre o rebirth via NCMD, lacunas de sequência, aliases desconhecidos, tempestades de rebirth e um fluxo de diagnóstico passo a passo.

Aplicação host enviando um comando de rebirth do Sparkplug e um edge node respondendo com novas mensagens NBIRTH e DBIRTH
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 rebirth do Sparkplug é um comando que uma aplicação host envia a um edge node para fazê-lo republicar as suas mensagens NBIRTH e DBIRTH, de modo que o host possa reconstruir uma visão completa e atual daquele node. Neste guia você vai aprender quais situações pedem um rebirth, como enviar um manualmente, como um edge node correto responde e como diagnosticar o problema mais comum em campo: nodes que fazem rebirth sem parar.

O que um rebirth faz

Os consumidores Sparkplug dependem das mensagens de birth para três coisas: a lista de métricas, o mapeamento de aliases para nomes e tipos de dados e o valor atual de cada métrica. Se um host perde um birth ou perde o controle da sequência, o seu modelo do node fica incompleto. Um rebirth corrige isso sem derrubar a conexão MQTT.

O comando é uma mensagem NCMD em spBv1.0/{group}/NCMD/{edge_node} contendo uma métrica booleana chamada Node Control/Rebirth definida como true. O edge node responde publicando um novo NBIRTH com o seq zerado e o mesmo bdSeq da sessão atual, seguido de um DBIRTH para cada device. Não existe rebirth separado em nível de device; um rebirth do node sempre republica todos os seus devices.

Quando um host deve solicitar um rebirth

Gatilho Por que importa
O host inicia ou reconecta quando o node já está online O host nunca viu os births originais
Lacuna no seq Uma mensagem se perdeu; os valores e possivelmente as definições de métricas podem estar errados
Dados recebidos com um alias desconhecido O host não consegue mapear o valor para uma métrica
Dados de um node ou device sem birth conhecido O host não tem nenhuma definição de métrica
Métrica com um nome ausente no birth A configuração do node mudou sem um novo birth
Operador pede uma atualização Recuperação manual durante o comissionamento

Aplicações host bem implementadas enviam essas solicitações automaticamente. Se você está escrevendo o seu próprio consumidor, implementar os três primeiros gatilhos cobre a maioria das situações reais.

Como o edge node deve responder

  1. Receber o NCMD e confirmar que a métrica Node Control/Rebirth é true.
  2. Zerar o seq.
  3. Publicar o NBIRTH com todas as métricas do node, seus valores atuais, o bdSeq atual e a métrica Node Control/Rebirth de volta para false.
  4. Publicar um DBIRTH para cada device conectado no momento.
  5. Retomar NDATA e DDATA com o seq continuando a partir dos births.

O bdSeq permanece o mesmo porque a sessão MQTT, e portanto o will NDEATH registrado, não mudou. Um node que incrementa o bdSeq no rebirth sem reconectar vai confundir os hosts que verificam o bdSeq quando um death chegar mais tarde. As regras completas dos certificados estão explicadas em certificados de birth e death do Sparkplug.

Envie um rebirth manualmente

Durante o comissionamento é útil disparar um rebirth você mesmo. Este script Python usa paho-mqtt 2.x e classes geradas a partir do arquivo sparkplug_b.proto do Eclipse Tahu (veja o nosso tutorial sobre como decodificar Sparkplug B em Python para o passo único de geração):

import sys
import time
import uuid

import paho.mqtt.client as mqtt
import sparkplug_b_pb2 as spb

if len(sys.argv) != 3:
    sys.exit("usage: python rebirth.py <group_id> <edge_node_id>")

group, node = sys.argv[1], sys.argv[2]

payload = spb.Payload()
payload.timestamp = int(time.time() * 1000)
metric = payload.metrics.add()
metric.name = "Node Control/Rebirth"
metric.timestamp = payload.timestamp
metric.datatype = 11  # Boolean
metric.boolean_value = True

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id=f"rebirth-{uuid.uuid4().hex[:8]}")
client.connect("broker.connectmq.com", 1883, keepalive=30)
client.loop_start()
info = client.publish(f"spBv1.0/{group}/NCMD/{node}", payload.SerializeToString(), qos=0)
info.wait_for_publish()
client.disconnect()
client.loop_stop()
print(f"rebirth sent to {group}/{node}")

Execute-o contra um simulador no servidor MQTT público, por exemplo python rebirth.py demo-3f9a1c line1, enquanto acompanha o group:

mosquitto_sub -h broker.connectmq.com -p 1883 -i rebirth-watch-77d2 -v \
  -t "spBv1.0/demo-3f9a1c/#"

Você deve ver o NCMD e, em instantes, um NBIRTH e um DBIRTH. Em um broker de produção, conecte pela porta 8883 com TLS e as suas credenciais do portal, e lembre-se de que apenas aplicações host autorizadas devem enviar comandos a equipamentos reais.

Fluxo de solução de problemas

Quando um host mostrar métricas desatualizadas ou ausentes, siga estes passos em ordem:

  1. O node está conectado? Verifique a conexão. No ConnectMQ, assine $SYS/broker/connection/{clientId}/state para o client ID do node ou consulte o portal.
  2. O node publicou os births? Procure NBIRTH e DBIRTH nos topics dele. Se nenhum aparecer depois da conexão, ele pode estar esperando uma Primary Host Application cujo STATE não consegue ver.
  3. O node assina o NCMD? Envie um rebirth manual. Se nada acontecer, o node não está assinando spBv1.0/{group}/NCMD/{node} ou não implementa rebirth.
  4. Os births contêm todas as métricas? Compare o DBIRTH decodificado com as tags esperadas. Métricas ausentes são um problema de configuração do node, não de transporte.
  5. O seq é contínuo? Observe várias mensagens de dados depois do birth. Lacunas indicam perda de mensagens ou um segundo cliente usando o mesmo edge node ID.
  6. Os aliases são resolvidos? Todo alias em NDATA ou DDATA precisa aparecer no birth mais recente. Se não aparecer, o node está enviando aliases que nunca declarou.
  7. O host está processando os births corretamente? Se o broker mostra births corretos, mas o host continua exibindo dados desatualizados, o problema está do lado do host.

Ver os payloads decodificados torna os passos 2, 4, 5 e 6 muito mais rápidos. O ConnectMQ decodifica Sparkplug B no topic explorer do portal, então você consegue ler a lista de métricas de um birth, conferir os valores de seq e identificar aliases sem escrever um decodificador.

Tempestades de rebirth e como interrompê-las

Uma tempestade de rebirth é um loop em que um node faz rebirth continuamente, inundando o broker e o host com mensagens de birth. Causas típicas:

Causa Como reconhecer Solução
Dois clientes com o mesmo edge node ID Valores de seq intercalados, desconexões frequentes Dê a cada node um ID único por group
Client ID duplicado O node se desconecta sempre que outro cliente se conecta Use client IDs únicos; no ConnectMQ use o ID emitido
O host trata a volta do seq de 255 para 0 como lacuna Rebirth a cada 256 mensagens Corrija a lógica de lacunas do host
Vários hosts solicitando rebirths Rebirth sempre que qualquer host reinicia Limite quais hosts podem enviar NCMD
O node publica aliases que não estão no birth Rebirth após cada mensagem de dados Corrija a configuração de aliases do node
Limites de taxa do broker atingidos durante os births Births truncados, lacuna detectada, novo rebirth Births menores ou um plano com limites mais altos

A última linha merece atenção em infraestrutura compartilhada. O servidor MQTT público permite 10 mensagens por segundo por cliente e 64 KB por mensagem, e os planos Serverless têm os seus próprios limites de tamanho de mensagem. Um node com milhares de métricas pode gerar um birth grande, então verifique os tamanhos ao passar de um simulador para equipamentos reais.

Os hosts também devem limitar a taxa das próprias solicitações. Uma regra simples é no máximo um rebirth pendente por node, liberado quando o NBIRTH chega, com backoff se o birth nunca vier.

Checklist de prevenção

  1. Edge node IDs únicos por group e client IDs MQTT únicos por conexão.
  2. Births sempre publicados antes dos dados, com todas as métricas e aliases declarados.
  3. seq zerado em todo NBIRTH; bdSeq inalterado no rebirth.
  4. Detecção de lacunas no host que trate a volta de 255 para 0.
  5. Um único host designado com permissão para enviar comandos em produção.
  6. Tamanho dos births conferido em relação aos limites do broker.

Mantenha o transporte confiável

A maioria dos rebirths é sintoma de algo anterior: conexões que caem, IDs duplicados ou um host reiniciando. Um broker estável reduz a primeira categoria. Um broker MQTT gerenciado ou um broker MQTT na nuvem tira das suas mãos patches, certificados e monitoramento. Para o panorama mais amplo do Sparkplug em arquiteturas de planta, leia o guia de IoT Industrial com MQTT.

Comece com o ConnectMQ

Crie um broker Serverless gratuito em app.connectmq.com, sem cartão de crédito. Conecte os seus edge nodes e o host, dispare um rebirth com o script acima e inspecione os births decodificados no topic explorer do ConnectMQ.

Perguntas frequentes

Um rebirth do Sparkplug desconecta o edge node?

Não. O node continua conectado e republica os seus births na mesma sessão MQTT. É por isso que o bdSeq não muda durante um rebirth.

Posso solicitar um rebirth para um único device?

Não. O comando de rebirth é direcionado ao edge node, que então republica o seu NBIRTH e um DBIRTH para cada device conectado.

Por que o meu host continua solicitando rebirths?

As causas mais comuns são edge node IDs duplicados, aliases não declarados nos births ou uma lógica no host que trata a volta normal do seq de 255 para 0 como uma lacuna.

Os births devem ser retained para evitar rebirths?

Não. Os births do Sparkplug nunca são retained. Um host que inicia depois solicita um rebirth para sempre obter os valores atuais.

Artigos relacionados

Cliente MQTT no CODESYS: Publicando Variáveis do CLP em um Broker

Configure a biblioteca IIoT MQTT Client do CODESYS para publicar variáveis do CLP em JSON, verifique-as no servidor MQTT público broker.connectmq.com e depois migre para um broker privado com credenciais e TLS.

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.