Ir al contenido

Conector OPC UA PubSub

El conector OPC UA PubSub implementa el patrón de publicación/suscripción definido por la especificación OPC UA PubSub (Parte 14). Habilita comunicación desacoplada y de alto rendimiento entre productores y consumidores OPC UA usando uno de dos mapeos de transporte:

  • MQTT - Mensajes codificados en JSON sobre MQTT/UDP para fan-out basado en broker
  • UADP - UADP binario (UA Datagram Protocol) sobre multicast UDP para distribución LAN de baja latencia

Tipos de Conector:

  • OpcuaPubSubReader - Escucha mensajes PubSub entrantes y los emite como cargas de Meddle
  • OpcuaPubSubWriter - Publica cargas de Meddle como mensajes PubSub
  • ✅ Dos transportes: MQTT (JSON) y UADP (multicast binario)
  • ✅ Decodificación automática de formatos de cable JSON y UADP
  • ✅ Gestión del grupo multicast UDP con selección de interfaz
  • ✅ Filtrado opcional por ID de publicador y nombre del dataset
  • ✅ Productor/consumidor desacoplado (no se necesita sesión punto a punto)
  • ✅ Diseñado para distribución de telemetría de alta frecuencia
{
"type": "OpcuaPubSubReader",
"config": {
"transport": "uadp",
"multicastAddr": "opc.udp://224.0.5.1:4840/eth0",
"publisherId": "Publisher_1",
"dataSetName": "TankFarmDataSet"
}
}
{
"type": "OpcuaPubSubWriter",
"config": {
"transport": "uadp",
"multicastAddr": "opc.udp://224.0.5.1:4840/eth0",
"publisherId": "Publisher_1",
"dataSetName": "TankFarmDataSet"
}
}

El transporte de cable usado para los mensajes PubSub. Debe ser uno de:

  • mqtt - Mensajes JSON sobre UDP (puenteado por broker en producción)
  • uadp - Tramas UADP binarias sobre multicast UDP
{
"transport": "uadp"
}

Obligatorio cuando transport: mqtt. La dirección a la que Meddle se enlaza (lector) o envía (escritor).

{
"brokerUrl": "192.168.1.20:1883"
}

Formato: host:puerto.

Notas:

  • El lector enlaza un escucha UDP en esta dirección
  • Para el escritor, esta es la dirección de destino a la que se envían los mensajes PubSub

Identificador de tópico lógico opcional. Metadato informativo incluido junto al filtrado por dataset.

{
"topic": "factory/line1"
}

Obligatorio cuando transport: uadp. El grupo multicast IPv4 más la interfaz opcional.

{
"multicastAddr": "opc.udp://224.0.5.1:4840/eth0"
}

Formato: opc.udp://<host>:<puerto>/<interfaz>.

  • host:puerto - El grupo multicast y el puerto (típicamente 224.0.5.1:4840 por defecto para OPC UA PubSub)
  • interfaz - Nombre de la interfaz de red requerido (eth0, en0, lo0)

¿Por qué se requiere la interfaz? Las uniones multicast UDP están delimitadas por interfaz. Sin una interfaz especificada, el SO no puede enlazar de forma fiable el grupo multicast, especialmente en macOS (lo0) y VMs cloud con múltiples NICs.

host:puerto simple (sin esquema) también se acepta por compatibilidad hacia atrás, pero se recomienda encarecidamente la selección de interfaz.

Identifica el origen de los mensajes PubSub.

{
"publisherId": "Publisher_1"
}

Notas:

  • Obligatorio en el escritor (cada mensaje publicado se etiqueta con él)
  • Opcional en el lector (cuando se define, sólo se conservan los mensajes de este publicador; cuando está vacío, se aceptan todos los publicadores)

Identifica el dataset lógico dentro de un publicador.

{
"dataSetName": "TankFarmDataSet"
}

Notas:

  • Opcional tanto en lector como en escritor
  • En el lector, actúa como filtro cuando se define

El transporte MQTT emite mensajes en un sobre JSON estándar:

{
"PublisherId": "Publisher_1",
"Messages": [
{
"DataSetName": "TankFarmDataSet",
"Payload": {
"tank_1_level": 78.4,
"tank_2_level": 62.1,
"pump_running": true
}
}
]
}

El transporte UADP emite tramas binarias siguiendo el framing de OPC UA Parte 14. El lector detecta automáticamente contenido UADP vs JSON y decodifica ambos. Cada DataSet UADP decodificado emite una carga de Meddle.

Multicast / UDP → OpcuaPubSubReader → (decodifica JSON o UADP) → Carga(s) de Meddle

Múltiples datasets en un único mensaje de red producen múltiples cargas de Meddle (una por dataset).

Carga de Meddle → OpcuaPubSubWriter → (codifica sobre JSON) → envío UDP → Suscriptores

El escritor siempre emite JSON para ambos transportes. Cada invocación de Write produce exactamente un mensaje de red.

1. Distribución Desacoplada de Telemetría de Planta

Sección titulada «1. Distribución Desacoplada de Telemetría de Planta»

Un PLC central publica variables de proceso a un grupo multicast UADP; múltiples suscriptores de Meddle las consumen independientemente.

{
"type": "OpcuaPubSubReader",
"config": {
"transport": "uadp",
"multicastAddr": "opc.udp://224.0.5.1:4840/eth0",
"publisherId": "PLC_Master"
}
}

Puentea OPC UA PubSub a un tópico MQTT amigable con JSON para ingesta en plataformas cloud:

{
"type": "OpcuaPubSubReader",
"config": {
"transport": "mqtt",
"brokerUrl": "0.0.0.0:1883",
"topic": "factory/sensors",
"dataSetName": "EnergyMeters"
}
}

Después del procesado, publica los KPIs agregados como un único mensaje PubSub:

{
"type": "OpcuaPubSubWriter",
"config": {
"transport": "uadp",
"multicastAddr": "opc.udp://224.0.5.1:4840/eth0",
"publisherId": "Edge_Gateway_1",
"dataSetName": "PlantKPIs"
}
}

Problema: El lector se ejecuta silenciosamente pero nunca emite cargas

Soluciones:

  1. Confirma que el grupo multicast coincide exactamente con el publicador (224.0.5.1:4840)
  2. Especifica la interfaz en multicastAddr (ej. /eth0) — el auto-descubrimiento no es fiable
  3. Usa un sniffer de red como tcpdump -i eth0 host 224.0.5.1 and port 4840 para confirmar que los paquetes llegan
  4. Verifica que el enrutamiento multicast está habilitado en los switches/routers entre publicador y suscriptor

Problema: La configuración UADP se rechaza al inicio

Soluciones:

  1. Actualiza multicastAddr para incluir la interfaz: opc.udp://224.0.5.1:4840/eth0
  2. En macOS la interfaz de loopback es lo0; en Linux es lo. Verifica con ifconfig o ip addr

Problema: El lector ve mensajes en el cable pero no emite ninguno

Soluciones:

  1. Comprueba el filtro publisherId en el lector — cuando está definido, sólo los mensajes de ese publicador pasan. Bórralo para aceptar todos
  2. Lo mismo para dataSetName — cuando está definido, sólo los datasets coincidentes pasan

Problema: bind: address already in use

Soluciones:

  1. Múltiples lectores en el mismo host deben usar puertos distintos
  2. Para multicast UADP, múltiples procesos en el mismo host pueden unirse al mismo grupo sólo si se respeta SO_REUSEPORT (Linux); en macOS sólo se permite un enlace por grupo+puerto por proceso

Problema: Se lanza ErrOpcuaPubSubDecode en cada mensaje

Soluciones:

  1. Comprueba si el publicador usa JSON o UADP — el lector auto-detecta pero los datos malformados fallan en ambas rutas
  2. Inspecciona la configuración PubSub del publicador: el tipo de contenido del dataset debe ser un escalar o estructura soportada
  3. Verifica que el publicador y el suscriptor coinciden en la codificación (la configuración PubSub del servidor OPC UA la define)

1. Usa UADP para Distribución Dentro de la Planta

Sección titulada «1. Usa UADP para Distribución Dentro de la Planta»

UADP es más rápido y tiene menos sobrecarga que JSON sobre MQTT. Úsalo siempre que controles la red.

JSON es portable y fácil de depurar. Cuando los mensajes deben atravesar Internet público o ser consumidos por herramientas no OPC UA, MQTT-JSON es más pragmático.

Nunca confíes en que el SO “adivine” la NIC correcta. Los hosts multi-homed y los contenedores fallan silenciosamente de lo contrario.

El filtrado por publisherId y dataSetName es barato del lado del servidor y reduce drásticamente la carga de procesado descendente.

  • Usa el rango reservado de la OPC Foundation (224.0.5.0/24)
  • Coordina con tu equipo de red — el multicast incontrolado puede inundar la LAN
  • Prueba con tcpdump/Wireshark antes de ir a producción
PLC (Publicador) → multicast UADP 224.0.5.1:4840
┌────────┼────────┬──────────────┐
↓ ↓ ↓ ↓
OpcuaPubSubReader OpcuaPubSubReader OpcuaPubSubReader
(Almacenamiento) (Dashboard) (Alertado)
│ │ │
↓ ↓ ↓
InfluxDb2Writer Chart Isa182 → Alert
ModbusReader → Reshape → OpcuaPubSubWriter (MQTT) → Broker Externo → Suscriptores Cloud

Puentea dispositivos Modbus heredados al ecosistema moderno OPC UA PubSub.

  • OPC UA - Protocolo clásico cliente/servidor OPC UA (punto a punto)
  • MQTT v5 - PubSub MQTT genérico (no OPC UA)
  • Modbus - Puentea dispositivos heredados al tejido PubSub
  • Reshape - Normaliza los nombres de campo antes de publicar
  • InfluxDB v2 - Persiste la telemetría suscrita