IoT industrial

Sparkplug B y el Unified Namespace: cómo estructurar los datos del IoT industrial sobre MQTT

Sparkplug B aporta al MQTT industrial un modelo estricto de sesión y payload, mientras que un Unified Namespace da a los datos de tu planta un hogar único y legible. Así encajan ambos, con consejos de diseño de topics y ejemplos en vivo.

Jerarquía de fábrica desde la empresa hasta la celda de trabajo mapeada a topics MQTT, que ilustra Sparkplug B y un Unified Namespace
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

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/+/+/+/alarms para 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 seq de 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/cnc1 se convierte en connectmq/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

  1. Acordad los niveles ISA-95 y las reglas de nomenclatura antes de que se conecte el primer dispositivo.
  2. Decide qué clases de datos necesitas (telemetry, state, alarms, cmd) y mantenlas coherentes.
  3. 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.
  4. Usa QoS 1 para estados y alarmas; consulta Niveles de QoS en MQTT explicados para conocer los pros y contras.
  5. Usa retained messages para el estado actual y mantén los payloads pequeños y tipados.
  6. 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.

Artículos relacionados

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.