Sparkplug B y el Unified Namespace son las dos ideas que aparecen en casi todos los proyectos de IoT industrial construidos sobre MQTT. En este artículo aprenderás qué es un Unified Namespace, cómo la jerarquía ISA-95 se convierte en una estructura de topics, cómo funcionan el namespace de topics y el payload de Sparkplug B, y cómo se complementan ambos enfoques. Por el camino publicarás mensajes ISA-95 y Sparkplug B reales en broker.connectmq.com.
Si los fundamentos de MQTT son nuevos para ti, lee primero qué es un broker MQTT.
El problema: un espagueti de conexiones punto a punto
Una planta típica tiene PLC, SCADA, un MES, un historian, un sistema de calidad y un ERP. Tradicionalmente, cada sistema se comunica con los demás mediante su propia conexión punto a punto. Si añades un panel nuevo, necesitas tres integraciones nuevas. Si cambias una etiqueta de un PLC, algo se rompe aguas abajo.
MQTT resuelve la parte del transporte: cada productor publica en un broker y cada consumidor se suscribe. Lo que MQTT no decide por ti es cómo nombrar los topics ni cómo dar formato a los payloads. Ese es exactamente el hueco que cubren el Unified Namespace y Sparkplug B.
¿Qué es un Unified Namespace?
Un Unified Namespace (UNS) es una vista única, jerárquica y basada en eventos del estado actual de todo el negocio. En lugar de pedir datos a cada sistema, cada sistema publica lo que sabe en un único árbol de topics compartido en el broker, y cada consumidor se suscribe a la parte que necesita.
Tres propiedades definen un buen UNS:
- Fuente única de verdad. El último valor de cada máquina, línea y orden reside en un solo lugar.
- Estructurado según el negocio. Los topics siguen la jerarquía física y organizativa, así que cualquiera puede encontrar los datos sin una lista de etiquetas.
- Informe por excepción. Los productores publican cuando algo cambia, y los retained messages dan a los nuevos suscriptores el estado actual al instante.
ISA-95 como estructura de topics
La forma más habitual de estructurar un UNS es la jerarquía de equipos de ISA-95. Cada nivel se convierte en un nivel de topic:
Enterprise / Site / Area / Line / WorkCell / <data class>
acme / izmir / machining / line1 / cnc1 / telemetry
Tabla de diseño de topics
| Nivel ISA-95 | Valor de ejemplo | Nivel de topic | Consejo de diseño |
|---|---|---|---|
| Enterprise (empresa) | acme | 1 | Identificador de empresa fijo y corto |
| Site (planta) | izmir | 2 | Uno por planta o ubicación |
| Area (área) | machining | 3 | Departamento o área de producción |
| Line (línea) | line1 | 4 | Línea de producción o celda de proceso |
| WorkCell (celda de trabajo) | cnc1 | 5 | Máquina, robot o estación |
| Clase de datos | telemetry, state, alarms, cmd | 6 | Separa los datos rápidos de los eventos y los comandos |
Algunas reglas prácticas:
- Usa ASCII en minúsculas, sin espacios, e IDs estables en lugar de nombres visibles.
- Mantén una profundidad predecible. Los consumidores dependen de comodines como
acme/izmir/+/+/+/alarmspara obtener todas las alarmas de una planta. - Mantén los comandos en su propia rama (
cmd) para poder protegerlos y auditarlos por separado de la telemetría. - Publica los mensajes de estado como retenidos para que un panel nuevo vea el valor actual al instante.
Pruébalo: publica un mensaje JSON ISA-95
El área pública del servidor MQTT público gratuito broker.connectmq.com admite hasta 8 niveles de topic, así que usa un prefijo aleatorio corto en lugar de uno largo. Suscríbete en una terminal:
mosquitto_sub -h broker.connectmq.com -p 1883 -i uns-a1b2-sub \
-t "a1b2/acme/#" -v
Publica una lectura de máquina desde otra terminal:
mosquitto_pub -h broker.connectmq.com -p 1883 -i uns-a1b2-cnc1 -q 1 \
-t "a1b2/acme/izmir/machining/line1/cnc1/telemetry" \
-m '{"spindleSpeed":12000,"temperature":41.7,"status":"RUNNING"}'
El suscriptor muestra el topic y el payload JSON. Todo lo que hay en el área pública puede leerlo cualquiera, así que nunca publiques allí datos reales de producción.
¿Qué es Sparkplug B?
Sparkplug B es una especificación abierta, mantenida bajo el paraguas de la Eclipse Foundation, que define tres cosas que MQTT deja abiertas: un namespace de topics fijo, un formato de payload binario y un modelo de gestión del estado. Se diseñó para que SCADA y las aplicaciones host puedan descubrir dispositivos automáticamente y sepan siempre si los datos están actualizados o caducados.
El namespace de topics de Sparkplug B
Todos los topics de Sparkplug B siguen este patrón:
spBv1.0/{group_id}/{message_type}/{edge_node_id}/{device_id}
group_id agrupa los edge nodes (por ejemplo, una planta), edge_node_id es el gateway o dispositivo edge, y el device_id opcional es un PLC o sensor situado detrás de ese edge node.
| Tipo de mensaje | Lo envía | Finalidad |
|---|---|---|
| NBIRTH | Edge node | El nodo se conecta y declara todas sus métricas |
| NDEATH | Broker (como Will) | El nodo se ha desconectado de forma inesperada |
| DBIRTH | Edge node | Un dispositivo detrás del nodo se conecta con sus métricas |
| DDEATH | Edge node | Un dispositivo se ha desconectado |
| NDATA / DDATA | Edge node | Valores de métricas modificados del nodo o del dispositivo |
| NCMD / DCMD | Aplicación host | Comandos de escritura a un nodo o dispositivo |
| STATE | Aplicación host | Anuncia si el host principal está en línea |
El mensaje NDEATH se registra como Last Will de MQTT cuando el edge node se conecta, de modo que el broker lo publica automáticamente si se cae la conexión. Los consumidores marcan entonces como caducados todos los datos de ese nodo.
Payload: Protobuf, alias y números de secuencia
Los payloads de Sparkplug B se codifican con Google Protocol Buffers. Un payload contiene una marca de tiempo, un número de secuencia y una lista de métricas; cada métrica tiene un nombre, un alias numérico opcional, un tipo de datos, una marca de tiempo y un valor.
Mecanismos clave:
- Certificados de nacimiento. NBIRTH y DBIRTH contienen todas las métricas con su nombre completo y su tipo de datos. Los mensajes DDATA posteriores pueden enviar solo el alias numérico y el nuevo valor, lo que mantiene los paquetes pequeños.
- Números de secuencia. Cada mensaje de un edge node lleva un valor
seqde 0 a 255 que vuelve a empezar al llegar al final. Si un host detecta un salto, sabe que se ha perdido un mensaje y puede enviar un comando de renacimiento (NCMD) para solicitar nuevos certificados de nacimiento. - bdSeq. Un número de secuencia de nacimiento/muerte vincula cada NDEATH con el NBIRTH de la misma sesión, de modo que un certificado de defunción antiguo no puede borrar una sesión más reciente.
Esta es la misma lectura de antes, mostrada como la representación JSON de un payload DDATA de Sparkplug B:
{
"timestamp": 1760600000000,
"seq": 1,
"metrics": [
{ "name": "temperature", "timestamp": 1760600000000, "dataType": "Double", "value": 41.7 }
]
}
Sparkplug B frente a Unified Namespace: complementarios, no rivales
| Aspecto | Sparkplug B | Unified Namespace ISA-95 |
|---|---|---|
| Estructura de topics | Fija: spBv1.0/group/type/node/device |
Libre, modelada según la jerarquía del negocio |
| Payload | Protobuf con métricas tipadas | Normalmente JSON, definido por ti |
| Conocimiento del estado | Integrado (birth, death, STATE) | Por convención, normalmente con retained messages |
| Legibilidad | Necesita un decodificador | Topics y payloads legibles por personas |
| Ideal para | Del edge al SCADA, descubrimiento de dispositivos, estado fiable | Acceso a nivel de toda la empresa, analítica, consumidores de TI |
En la práctica, muchas plantas usan ambos. Los edge nodes hablan Sparkplug B porque ofrece un estado fiable y payloads eficientes cerca de las máquinas. Después, los datos se republican en un namespace estructurado según ISA-95 en JSON legible, donde el MES, los paneles, las aplicaciones de TI y hasta un gemelo digital 3D de la planta los consumen sin tocar nunca Protobuf. La parte difícil es esa capa de traducción, y ahí es donde el broker puede ayudar.
Cómo gestiona ConnectMQ Sparkplug B y los topics ISA-95
ConnectMQ es un broker MQTT gestionado con soporte integrado para el IoT industrial:
- Detección de ISA-95. Reconoce estructuras de topics ISA-95 y de Unified Namespace en tu tráfico.
- Decodificación de Sparkplug B. Detecta mensajes Sparkplug B y decodifica tanto payloads Protobuf como JSON.
- Republicación en ISA-95. Los datos de Sparkplug B pueden republicarse en una estructura ISA-95; por ejemplo,
spBv1.0/factory1/DDATA/line1/cnc1se convierte enconnectmq/factory1/production/line1/cnc1/telemetry, con un payload JSON plano que cualquier suscriptor puede leer. - Vistas en el portal. La vista de dispositivos del portal organiza tus equipos por niveles ISA-95, y las reglas de alerta por umbral con su registro de alertas te permiten reaccionar cuando, por ejemplo, la temperatura de un husillo supera un límite.
Pruébalo: entra Sparkplug B, sale telemetría legible
Usa un group ID único como a1b2plant. Primero suscríbete tanto al topic de Sparkplug como a la rama republicada:
mosquitto_sub -h broker.connectmq.com -p 1883 -i spb-a1b2-sub -v \
-t "spBv1.0/a1b2plant/#" -t "connectmq/a1b2plant/#"
Después publica un mensaje DDATA con un payload Sparkplug B en JSON:
mosquitto_pub -h broker.connectmq.com -p 1883 -i spb-a1b2-edge -q 1 \
-t "spBv1.0/a1b2plant/DDATA/line1/cnc1" \
-m '{"timestamp":1760600000000,"seq":1,"metrics":[{"name":"temperature","timestamp":1760600000000,"dataType":"Double","value":41.7}]}'
Cuando lo probamos en broker.connectmq.com, el suscriptor recibió el mensaje Sparkplug B original y un segundo mensaje bajo connectmq/a1b2plant/.../line1/cnc1/telemetry con el payload {"temperature":41.7,"timestamp":1760600000000}. Las herramientas posteriores pueden suscribirse ahora a connectmq/a1b2plant/+/+/+/telemetry y obtener JSON limpio por máquina.
Para producción, crea un broker dedicado en el portal y conéctate con YOUR_USERNAME, YOUR_PASSWORD y YOUR_CLIENT_ID por TLS en el puerto 8883. Los topics de cada inquilino están aislados de los demás inquilinos y del área pública. Consulta las buenas prácticas de seguridad en MQTT para orientarte sobre credenciales y TLS.
Lista de diseño para tu primer UNS
- Acordad los niveles ISA-95 y las reglas de nomenclatura antes de que se conecte el primer dispositivo.
- Decide qué clases de datos necesitas (
telemetry,state,alarms,cmd) y mantenlas coherentes. - Usa Sparkplug B en el edge donde necesites conocer el nacimiento y la muerte de los nodos, y una rama ISA-95 legible para todos los demás.
- Usa QoS 1 para estados y alarmas; consulta Niveles de QoS en MQTT explicados para conocer los pros y contras.
- Usa retained messages para el estado actual y mantén los payloads pequeños y tipados.
- Elige un broker que pueda crecer contigo; cómo elegir un broker MQTT para IoT repasa los criterios.
Empieza con ConnectMQ
Puedes probar ahora mismo los dos ejemplos anteriores en el servidor público. Para construir un Unified Namespace real con topics aislados, vistas de dispositivos ISA-95 y alertas por umbral, regístrate en app.connectmq.com. El plan Serverless es gratuito, no requiere tarjeta de crédito y puedes escalar a Dedicated, BYOC o Self Managed Enterprise cuando tu planta entre en producción.
Preguntas frecuentes
¿Sparkplug B es lo mismo que un Unified Namespace?
No. Sparkplug B es una especificación de topics, payloads y estado de sesión sobre MQTT, mientras que un Unified Namespace es un patrón de arquitectura para organizar todos los datos del negocio en una única jerarquía. Funcionan muy bien juntos.
¿Puedo leer mensajes Sparkplug B sin un decodificador Protobuf?
No directamente, porque el payload es binario. ConnectMQ decodifica payloads Sparkplug B en Protobuf y JSON y puede republicarlos como JSON legible en una estructura de topics ISA-95.
¿Qué profundidad debe tener una jerarquía de topics ISA-95?
Enterprise, Site, Area, Line y WorkCell más una clase de datos dan seis niveles, lo que se ajusta a la mayoría de las plantas. Mantén una profundidad coherente para que las suscripciones con comodines funcionen de forma predecible.
¿Sparkplug B requiere MQTT 5?
No. Sparkplug B funciona sobre MQTT 3.1.1 y es habitual desplegarlo así. ConnectMQ admite tanto MQTT 3.1.1 como MQTT 5.0, de modo que los edge nodes de Sparkplug y los clientes más modernos pueden compartir el mismo broker.



