Conector OPC UA PubSub
Descripción General
Sección titulada «Descripción General»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 MeddleOpcuaPubSubWriter- Publica cargas de Meddle como mensajes PubSub
Características
Sección titulada «Características»- ✅ 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
Configuración Básica
Sección titulada «Configuración Básica»Lector OPC UA PubSub
Sección titulada «Lector OPC UA PubSub»{ "type": "OpcuaPubSubReader", "config": { "transport": "uadp", "multicastAddr": "opc.udp://224.0.5.1:4840/eth0", "publisherId": "Publisher_1", "dataSetName": "TankFarmDataSet" }}{ "type": "OpcuaPubSubReader", "config": { "transport": "mqtt", "brokerUrl": "0.0.0.0:1883", "topic": "factory/line1", "publisherId": "Publisher_1", "dataSetName": "LineOneMetrics" }}Escritor OPC UA PubSub
Sección titulada «Escritor OPC UA PubSub»{ "type": "OpcuaPubSubWriter", "config": { "transport": "uadp", "multicastAddr": "opc.udp://224.0.5.1:4840/eth0", "publisherId": "Publisher_1", "dataSetName": "TankFarmDataSet" }}{ "type": "OpcuaPubSubWriter", "config": { "transport": "mqtt", "brokerUrl": "192.168.1.20:1883", "topic": "factory/line1", "publisherId": "Publisher_1", "dataSetName": "LineOneMetrics" }}Parámetros de Configuración
Sección titulada «Parámetros de Configuración»Transport
Sección titulada «Transport»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"}Broker URL (Transporte MQTT)
Sección titulada «Broker URL (Transporte MQTT)»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
Topic (Transporte MQTT)
Sección titulada «Topic (Transporte MQTT)»Identificador de tópico lógico opcional. Metadato informativo incluido junto al filtrado por dataset.
{ "topic": "factory/line1"}Multicast Address (Transporte UADP)
Sección titulada «Multicast Address (Transporte UADP)»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ípicamente224.0.5.1:4840por 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.
Publisher ID
Sección titulada «Publisher ID»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)
DataSet Name
Sección titulada «DataSet Name»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
Formatos de Cable
Sección titulada «Formatos de Cable»JSON (Transporte MQTT)
Sección titulada «JSON (Transporte MQTT)»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 } } ]}UADP (Transporte UADP)
Sección titulada «UADP (Transporte UADP)»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.
Flujo de Datos
Sección titulada «Flujo de Datos»Multicast / UDP → OpcuaPubSubReader → (decodifica JSON o UADP) → Carga(s) de MeddleMúltiples datasets en un único mensaje de red producen múltiples cargas de Meddle (una por dataset).
Escritor
Sección titulada «Escritor»Carga de Meddle → OpcuaPubSubWriter → (codifica sobre JSON) → envío UDP → SuscriptoresEl escritor siempre emite JSON para ambos transportes. Cada invocación de Write produce exactamente un mensaje de red.
Casos de Uso Comunes
Sección titulada «Casos de Uso Comunes»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" }}2. Telemetría IoT con Puente MQTT
Sección titulada «2. Telemetría IoT con Puente MQTT»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" }}3. Gateway Edge Publicando KPIs Agregados
Sección titulada «3. Gateway Edge Publicando KPIs Agregados»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" }}Solución de Problemas
Sección titulada «Solución de Problemas»No Se Reciben Mensajes (UADP)
Sección titulada «No Se Reciben Mensajes (UADP)»Problema: El lector se ejecuta silenciosamente pero nunca emite cargas
Soluciones:
- Confirma que el grupo multicast coincide exactamente con el publicador (
224.0.5.1:4840) - Especifica la interfaz en
multicastAddr(ej./eth0) — el auto-descubrimiento no es fiable - Usa un sniffer de red como
tcpdump -i eth0 host 224.0.5.1 and port 4840para confirmar que los paquetes llegan - Verifica que el enrutamiento multicast está habilitado en los switches/routers entre publicador y suscriptor
network interface is required
Sección titulada «network interface is required»Problema: La configuración UADP se rechaza al inicio
Soluciones:
- Actualiza
multicastAddrpara incluir la interfaz:opc.udp://224.0.5.1:4840/eth0 - En macOS la interfaz de loopback es
lo0; en Linux eslo. Verifica conifconfigoip addr
Publicador Filtrado
Sección titulada «Publicador Filtrado»Problema: El lector ve mensajes en el cable pero no emite ninguno
Soluciones:
- Comprueba el filtro
publisherIden el lector — cuando está definido, sólo los mensajes de ese publicador pasan. Bórralo para aceptar todos - Lo mismo para
dataSetName— cuando está definido, sólo los datasets coincidentes pasan
Puerto UDP Ya En Uso
Sección titulada «Puerto UDP Ya En Uso»Problema: bind: address already in use
Soluciones:
- Múltiples lectores en el mismo host deben usar puertos distintos
- 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
Errores de Decodificación
Sección titulada «Errores de Decodificación»Problema: Se lanza ErrOpcuaPubSubDecode en cada mensaje
Soluciones:
- Comprueba si el publicador usa JSON o UADP — el lector auto-detecta pero los datos malformados fallan en ambas rutas
- Inspecciona la configuración PubSub del publicador: el tipo de contenido del dataset debe ser un escalar o estructura soportada
- Verifica que el publicador y el suscriptor coinciden en la codificación (la configuración PubSub del servidor OPC UA la define)
Mejores Prácticas
Sección titulada «Mejores Prácticas»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.
2. Usa MQTT-JSON para Puentes Multi-Sitio
Sección titulada «2. Usa MQTT-JSON para Puentes Multi-Sitio»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.
3. Siempre Define la Interfaz en UADP
Sección titulada «3. Siempre Define la Interfaz en UADP»Nunca confíes en que el SO “adivine” la NIC correcta. Los hosts multi-homed y los contenedores fallan silenciosamente de lo contrario.
4. Filtra en el Suscriptor
Sección titulada «4. Filtra en el Suscriptor»El filtrado por publisherId y dataSetName es barato del lado del servidor y reduce drásticamente la carga de procesado descendente.
5. Planifica el IP Multicast Cuidadosamente
Sección titulada «5. Planifica el IP Multicast Cuidadosamente»- 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/Wiresharkantes de ir a producción
Flujos de Trabajo de Ejemplo
Sección titulada «Flujos de Trabajo de Ejemplo»Fan-Out de Telemetría en Toda la Planta
Sección titulada «Fan-Out de Telemetría en Toda la Planta»PLC (Publicador) → multicast UADP 224.0.5.1:4840 │ ┌────────┼────────┬──────────────┐ ↓ ↓ ↓ ↓ OpcuaPubSubReader OpcuaPubSubReader OpcuaPubSubReader (Almacenamiento) (Dashboard) (Alertado) │ │ │ ↓ ↓ ↓ InfluxDb2Writer Chart Isa182 → AlertPuente Edge-a-Cloud
Sección titulada «Puente Edge-a-Cloud»ModbusReader → Reshape → OpcuaPubSubWriter (MQTT) → Broker Externo → Suscriptores CloudPuentea dispositivos Modbus heredados al ecosistema moderno OPC UA PubSub.
Conectores Relacionados
Sección titulada «Conectores Relacionados»- 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