El namespace de topics Sparkplug es la estructura fija que utiliza todo mensaje Sparkplug B: spBv1.0/group_id/message_type/edge_node_id/device_id. En esta guía aprenderás qué significa cada elemento, cómo nombrar grupos, nodos y dispositivos para que sigan siendo manejables y qué suscripciones con comodines necesitas para monitorización, comandos y depuración.
Por qué Sparkplug fija la estructura de topics
MQTT puro te permite inventar la jerarquía de topics que quieras. Esa libertad es estupenda para un proyecto aislado y un problema en toda una planta, donde cada integrador elige un esquema distinto. Sparkplug elimina la elección. Los topics siguen un único patrón, de modo que cualquier aplicación host compatible con Sparkplug puede descubrir todos los edge nodes y dispositivos sin configuración específica por planta.
La contrapartida es que el topic no describe la jerarquía de tu planta más allá de grupo, nodo y dispositivo. Planta, área y línea se codifican en los IDs de grupo y de nodo o dentro de los nombres de las métricas. Esa distinción es importante cuando diseñas un Unified Namespace, y volveremos a ella más adelante.
El namespace de topics Sparkplug elemento a elemento
spBv1.0/{group_id}/{message_type}/{edge_node_id}/{device_id}
| Elemento | Ejemplo | Significado | Obligatorio |
|---|---|---|---|
| Namespace | spBv1.0 |
Identifica la versión del payload Sparkplug B | Siempre |
| group_id | factory1 |
Agrupación lógica de edge nodes | Siempre |
| message_type | DDATA |
Qué tipo de mensaje es | Siempre |
| edge_node_id | line1 |
El gateway o edge node | Siempre |
| device_id | cnc1 |
Un dispositivo detrás del edge node | Solo en mensajes D |
Namespace: spBv1.0
El primer nivel es siempre la cadena literal spBv1.0. Indica a los consumidores que el payload es Protobuf de Sparkplug B. El antiguo Sparkplug A usaba spAv1.0 y está obsoleto. Si ves un topic que empieza por cualquier otra cosa, no es Sparkplug B, aunque el payload resulte ser Protobuf.
group_id
El group ID agrupa los edge nodes de forma lógica. Muchos equipos usan una planta o un área, por ejemplo plant-izmir o packaging. Una aplicación host suele suscribirse por grupo, así que elige grupos que coincidan con la forma en que quieres repartir la monitorización y los permisos.
message_type
Es el núcleo del namespace. Indica al consumidor cómo tratar el payload:
| Tipo | Emisor | Finalidad |
|---|---|---|
| NBIRTH | Edge node | El nodo se conectó y anuncia todas sus métricas |
| NDEATH | Broker (will) o nodo | El nodo se desconectó |
| DBIRTH | Edge node | El dispositivo se conectó y anuncia sus métricas |
| DDEATH | Edge node | El dispositivo se desconectó |
| NDATA | Edge node | Valores modificados de métricas del nodo |
| DDATA | Edge node | Valores modificados de métricas del dispositivo |
| NCMD | Aplicación host | Comando al edge node, por ejemplo un rebirth |
| DCMD | Aplicación host | Comando a un dispositivo, por ejemplo escribir una consigna |
| STATE | Aplicación host | Estado online/offline del host |
Los tipos birth y death contienen el modelo de estado que hace fiable a Sparkplug. Nuestra guía sobre certificados de birth y death de Sparkplug explica el ciclo de vida completo.
edge_node_id
El edge node ID identifica el gateway, PLC o software que mantiene la conexión MQTT. Debe ser único dentro de su grupo. Dos nodos con el mismo ID sobrescriben mutuamente sus births y corrompen los números de secuencia, uno de los fallos más habituales durante la puesta en marcha.
device_id
Los dispositivos están detrás de un edge node: un CNC, un variador, un contador Modbus. Los mensajes de nivel de dispositivo (DBIRTH, DDEATH, DDATA, DCMD) añaden el device ID como quinto nivel. Los mensajes de nivel de nodo terminan en el edge node ID.
El topic STATE
El mensaje STATE es la excepción al patrón. En Sparkplug 3.0 es spBv1.0/STATE/{host_id} con un pequeño payload JSON, publicado como retained por la aplicación host primaria de Sparkplug. Las implementaciones antiguas de la versión 2.2 usaban STATE/{host_id} sin el prefijo del namespace. Si conviven versiones distintas, comprueba qué forma esperan tu host y tus nodos.
Reglas de nomenclatura que te ahorrarán problemas
La especificación prohíbe los caracteres especiales de MQTT +, # y / dentro de los IDs de grupo, nodo y dispositivo, porque romperían los niveles del topic. Además, algunas convenciones ayudan:
- Usa solo minúsculas, dígitos y guiones. Mezclar mayúsculas y minúsculas provoca discrepancias entre sistemas.
- Mantén los IDs estables. Renombrar un edge node crea un nodo nuevo desde el punto de vista del host, y el histórico puede quedar dividido.
- No codifiques en un ID valores que cambian, como la versión de firmware o la dirección IP.
- Lleva la jerarquía más profunda a los nombres de métrica, por ejemplo
Spindle/Speed, en lugar de intentar añadir niveles al topic. - Documenta el significado de cada grupo para que los nuevos integradores ubiquen correctamente los nodos.
- Mantén los IDs cortos. Se repiten en cada topic y aparecen en todos los logs.
Suscripciones útiles
La estructura fija hace que las suscripciones con comodines sean predecibles. Estos son los patrones que más usarás:
spBv1.0/# todo lo de Sparkplug en el broker
spBv1.0/factory1/# todo lo de un grupo
spBv1.0/+/NBIRTH/# cada birth de nodo, todos los grupos
spBv1.0/+/DDATA/+/+ cada mensaje de datos de dispositivo
spBv1.0/factory1/+/line1/# todo lo de un edge node
spBv1.0/factory1/DDATA/line1/cnc1 los datos de un dispositivo
spBv1.0/STATE/+ estado de las aplicaciones host
Puedes probarlos con el servidor MQTT público gratuito. El área pública es legible por todo el mundo, así que usa un group ID aleatorio y no publiques nunca datos reales de planta allí:
mosquitto_sub -h broker.connectmq.com -p 1883 -i ns-explorer-5c21 -t "spBv1.0/demo-5c21/#" -v
En una segunda terminal, publica un mensaje de prueba en un topic de datos de dispositivo. Aquí el payload es texto plano solo para verificar el enrutamiento; un nodo real envía Protobuf:
mosquitto_pub -h broker.connectmq.com -p 1883 -i ns-pub-5c21 -t "spBv1.0/demo-5c21/DDATA/line1/cnc1" -m "routing test"
Ten en cuenta que los topics Sparkplug del broker público usan cinco niveles, holgadamente dentro de su límite de ocho, así que un simulador Sparkplug funciona allí sin cambios.
Explorar el namespace en un explorador de topics
Un namespace se entiende mucho mejor cuando puedes verlo como un árbol. En ConnectMQ, el explorador de topics del portal muestra los topics spBv1.0 a medida que llegan y, como el broker decodifica Sparkplug B, puedes hacer clic en un topic DDATA y leer sus métricas en lugar de bytes en bruto. Así respondes rápidamente a preguntas de puesta en marcha, como si un nuevo edge node ya ha publicado su birth o qué dispositivos cuelgan de un nodo determinado.
ConnectMQ también puede republicar datos Sparkplug en topics ISA-95. Un mensaje en spBv1.0/factory1/DDATA/line1/cnc1 queda disponible en connectmq/factory1/production/line1/cnc1/telemetry, más cómodo para dashboards y herramientas que esperan una jerarquía de planta.
Topics Sparkplug y el Unified Namespace
El namespace de topics Sparkplug es plano por diseño: grupo, nodo, dispositivo. Un Unified Namespace suele seguir ISA-95: empresa, planta, área, línea, celda. Ambas visiones coexisten en muchas arquitecturas. Sparkplug se encarga del transporte fiable y consciente del estado desde el edge, y un árbol ISA-95 ofrece a personas y aplicaciones un modelo navegable. Para el razonamiento de diseño, lee MQTT, Sparkplug B y el Unified Namespace, y para el contexto general consulta la guía de IoT industrial con MQTT.
Solución de problemas con los topics
| Síntoma | Causa probable | Qué comprobar |
|---|---|---|
| El host nunca ve un nodo | Errata en el topic o mayúsculas incorrectas en spBv1.0 |
La cadena exacta del namespace, que distingue mayúsculas |
| Dos nodos hacen rebirth continuamente | Edge node ID duplicado en un grupo | IDs únicos por grupo |
| No se reciben comandos | El nodo no está suscrito a sus topics NCMD/DCMD | El nodo se suscribe a spBv1.0/group/NCMD/node y a DCMD |
| Se ignoran los datos del dispositivo | DDATA enviado antes del DBIRTH | El dispositivo debe publicar primero el DBIRTH |
| Falta el estado del host | Host y nodos no coinciden en el formato del topic STATE | Topic STATE de 2.2 frente a 3.0 |
Cuando sospeches un problema de topics, suscríbete a spBv1.0/your-group/# con salida detallada y observa el orden de los mensajes durante el arranque. Primero deben llegar los births y después los datos.
Dónde ejecutarlo
El tráfico Sparkplug funciona en cualquier broker MQTT que cumpla el estándar, pero las plantas en producción necesitan credenciales, TLS y alguien responsable de la disponibilidad. Un broker MQTT gestionado se ocupa de la infraestructura para que tu equipo se centre en la nomenclatura, el modelado y la integración. Una vez que fluyen los births y los datos, el siguiente paso es leer los propios payloads, algo que cubre nuestra guía del payload Sparkplug B.
Empieza con ConnectMQ
Crea un broker Serverless gratuito en app.connectmq.com, sin tarjeta de crédito. Conecta tu edge node con las credenciales generadas mediante TLS en el puerto 8883 y explora tu namespace de topics Sparkplug, decodificado y organizado, en el explorador de topics de ConnectMQ.
Preguntas frecuentes
¿Puedo añadir más niveles a un topic Sparkplug?
No. El namespace de topics Sparkplug tiene cuatro niveles fijos para los mensajes de nodo y cinco para los de dispositivo. Lleva la jerarquía adicional a los nombres de las métricas o mapea los datos a un árbol ISA-95.
¿El group ID equivale a una planta?
Puede serlo, pero la especificación solo lo define como una agrupación lógica de edge nodes. Muchos equipos usan un grupo por planta o por área, según cómo se delimiten las aplicaciones host.
¿Por qué el topic STATE tiene un aspecto distinto?
Los mensajes STATE proceden de aplicaciones host, no de edge nodes, por lo que no siguen el patrón de nodo y dispositivo. En Sparkplug 3.0 el topic es spBv1.0/STATE/{host_id}.
¿Los topics Sparkplug distinguen entre mayúsculas y minúsculas?
Sí. Los topics MQTT distinguen mayúsculas y minúsculas, así que spBv1.0 y SPBV1.0 son topics distintos, igual que Line1 y line1.



