Aprende a crear la conexión entre MQTT y el gateway más potente.

Soporte MQTT del PHANTOM® Gateway 2.0

El Gateway 2.0 que se usa en el sistema de sensores inalámbricos ERBESSD INSTRUMENTS® PHANTOM®, y el monitor cableado DEFIANT™, soportan el protocolo IoT MQTT. Todos los datos de los sensores están disponibles por MQTT, incluidos temperatura, RPM, bandas de frecuencia y valores globales de los canales cableados, así como las formas de onda completas de los sensores de vibración (la FFT debe procesarla el usuario a partir de la TWF).

El gateway actúa como cliente MQTT y se conecta al broker MQTT que elijas, publicando todo lo que recolecta en JSON plano y autodescriptivo.

Puedes usar el soporte MQTT al mismo tiempo que el resto de los protocolos que soporta el Gateway, incluidos EI-Analytic™, EI Monitor, OPC UA y Modbus.

Algunas de las opciones descritas aquí se agregaron en versiones posteriores del gateway. Si no encuentras alguna en tu consola de administración, actualiza el gateway al firmware más reciente.

Resumen del soporte del protocolo

Elemento Qué hace el gateway
Rol Cliente MQTT. El gateway se conecta hacia tu broker, así que no hace falta abrir puertos de entrada en el firewall.
Versión de MQTT MQTT 3.1.1 (nivel de protocolo 4). Cualquier broker MQTT 3.1.1 o MQTT 5.0 acepta la conexión, porque los brokers 5.0 son compatibles hacia atrás con clientes 3.1.1.
Transportes mqtt:// (TCP simple), mqtts:// (TLS), ws:// (WebSocket), wss:// (WebSocket sobre TLS).
Puerto A tu elección, 1-65535. Por defecto 1883.
QoS 0, 1 o 2, seleccionable de forma independiente para la publicación y para la suscripción de administración.
Autenticación Anónima, o usuario + contraseña. Opcionalmente TLS mutuo con un certificado de cliente X.509.
Client ID PhantomGW-<serieDelGateway> por defecto; puede fijarse al valor que quieras.
Formato del payload JSON abierto en UTF-8. Opcionalmente comprimido con gzip. Nada binario ni propietario viaja por el cable.
Broker local Broker embebido opcional en el puerto 1883 (solo en hardware PHANTOM® Gateway).
Reconexión Automática, reintentada cada 10 s. Las formas de onda que fallan al publicarse se reintentan desde el almacenamiento offline del gateway.
Canal inverso Opcional. El gateway puede suscribirse a un tópico de administración y aceptar por MQTT toda la API de administración del Gateway.

Cómo habilitar el soporte MQTT

Para habilitar el soporte MQTT en la consola de administración del Gateway 2.0, actívalo en la página de configuración MQTT marcando la casilla “Enable MQTT connection”.

Luego llena las opciones de tu broker MQTT. Soportamos los siguientes protocolos para conectarse al broker MQTT:

  • mqtt://
  • mqtts:// (cifrado)
  • ws:// (websocket)
  • wss:// (websocket cifrado)

Debes ingresar el nombre de host o la dirección IP de tu broker MQTT, el puerto y, opcionalmente, el usuario y la contraseña para la autenticación.

Si deseas recibir las formas de onda completas de los sensores de vibración, marca la casilla correspondiente. Las formas de onda son mensajes grandes, así que si no piensas usarlas puedes dejar la opción sin marcar.

La opción “Allow Gateway management though MQTT” te permite usar toda la API de administración para controlar el gateway y sus sensores mediante la conexión MQTT.

Pantalla de MQTT

Después de guardar la configuración, el Gateway 2.0 se reiniciará. Al reiniciarse intentará conectarse al broker MQTT y mostrará un estado en la misma sección MQTT de la parte superior si hay algún problema: connecting, connected, reconnecting, closed o error, incluyendo el mensaje de error del broker cuando la conexión es rechazada.

Referencia de campos

Campo Descripción
Protocol mqtt://, mqtts://, ws:// o wss://.
MQTT server Nombre de host o dirección IP de tu broker.
Port Puerto del broker. 1883 simple, 8883 TLS, 443/8083 WebSocket son las opciones habituales.
Certificate validation Solo se muestra con mqtts:// y wss://. Ver la sección de seguridad más abajo.
CA certificate (PEM format) Pega tu propia CA cuando la validación esté en Custom CA.
Username / Password Deja ambos vacíos para una conexión anónima.
Publish Topic Tópico base de todos los mensajes publicados. Obligatorio.
Client Id Sustituye el valor por defecto PhantomGW-<serie>. Déjalo vacío para conservar el predeterminado.
Publish QoS 0, 1 o 2.
Append gateway and sensor serial number as subtopics Convierte el tópico base plano en un árbol de tópicos por sensor. Ver la sección de tópicos más abajo.
Publish vibration waveforms & thermal images Habilita los mensajes grandes collection. Desactivado por defecto.
Send wired channels overalls Solo DEFIANT™: Never, As fast as possible o Timeout.
Wired overall send timeout Solo DEFIANT™, cuando la cadencia es Timeout: segundos mínimos entre publicaciones por canal (1-216000).
Compress (gzip) payload Comprime con gzip todos los payloads.
Allow Gateway management through MQTT Suscribe el gateway a un tópico de comandos. Ver la sección de administración más abajo.
Subscribe topic Tópico que escucha el gateway cuando la administración está habilitada.
Subscribe QoS QoS usado para esa suscripción.
Client Certificate / Client Key (PEM format) Dentro de Advanced, solo para mqtts:// y wss://. Habilita TLS mutuo.

Seguridad: TLS y autenticación

Selecciona mqtts:// o wss:// para cifrar el enlace. El selector Certificate validation controla cómo se verifica el certificado del broker:

Modo Comportamiento Cuándo usarlo
Skip certificate validation (insecure) El certificado no se verifica. El canal va cifrado pero no se autentica la identidad del broker. Solo para pruebas de laboratorio o banco.
Validate against included CA list Verificación estándar contra el paquete de CA públicas que trae el gateway. Brokers en la nube pública (AWS IoT Core, Azure, HiveMQ Cloud, EMQX Cloud…).
Custom CA Se verifica contra un certificado de CA que pegas en formato PEM. PKI privada o autofirmada, brokers on-premise.

El panel Advanced acepta un certificado de cliente y su llave privada, ambos en formato PEM, y solo se usan con mqtts:// o wss://. Es lo que esperan los brokers que exigen identidad de dispositivo X.509, como AWS IoT Core.

El usuario y la contraseña viajan en el paquete CONNECT de MQTT. Sobre mqtt:// o ws:// se envían en texto claro, así que acompaña siempre las credenciales con mqtts:// o wss://.

El broker MQTT dentro del gateway

El hardware PHANTOM® Gateway también puede ejecutar su propio broker MQTT embebido, de modo que un PLC, un SCADA o una aplicación de borde en la misma red pueda suscribirse directamente al gateway sin infraestructura externa. No está disponible en el gateway USB/PC. Habilítalo con Enable local MQTT broker.

Propiedad Valor
Escucha 1883, en todas las interfaces
Autenticación Ninguna (anónima)
TLS No disponible en el broker local
Persistencia Deshabilitada, los mensajes no se guardan entre reinicios

El broker local tiene su propio Publish Topic, interruptor de Append serial, interruptor de formas de onda, de compresión y de administración, independientes de la configuración del broker remoto. Ambos pueden funcionar a la vez: la misma lectura se publica entonces en tu broker remoto y en el local.

mosquitto_sub -h <ip-del-gateway> -p 1883 -t "phantom/#" -v

Como el broker local no lleva autenticación, mantenlo en un segmento de red OT de confianza.

Estructura de tópicos

Con Append gateway and sensor serial number as subtopics deshabilitado, todos los mensajes se publican en el Publish Topic base tal como lo escribiste.

Con la opción habilitada, el gateway construye un árbol de tópicos. Usando un tópico base phantom, un número de serie de gateway EIGW12345 y un número de serie de sensor (phantomCode) 40217:

Mensaje Tópico dataType
Actualización de estado del sensor phantom/EIGW12345/40217/stateupdate stateupdate
Actualización de bandas de frecuencia phantom/EIGW12345/40217/bands bandsUpdate
Forma de onda / imagen térmica phantom/EIGW12345/40217/collection collection
Globales de canal cableado (DEFIANT™) phantom/EIGW12345/WIRED0/stateupdate wiredOveralls
Forma de onda de canal cableado (DEFIANT™) phantom/EIGW12345/<serie>/collection wiredCollection
Tags Modbus / unidades personalizadas phantom/EIGW12345/customunits customUnitStateUpdate
Respuestas de la API de administración phantom/EIGW12345 (variable)

Suscríbete a todo con phantom/#, a un solo gateway con phantom/EIGW12345/#, o a un solo sensor con phantom/EIGW12345/40217/#.

Distingue siempre por el campo dataType, no por el tópico. Cuando Append serial está desactivado, todos los tipos de mensaje llegan al mismo tópico.

Formato del payload

El Gateway empieza a publicar mensajes cada vez que un sensor actualiza sus datos (en su propio intervalo interno de actualización) o cuando se toma una medición de forma de onda. Los mensajes son objetos JSON en UTF-8, un objeto por mensaje. Nada es binario, propietario ni depende de un registro de esquemas: puedes consumirlos con JSON.parse, json.loads, un nodo json de Node-RED, el parser json_v2 de Telegraf o cualquier lector de tags JSON de SCADA.

Dos reglas aplican a todos los mensajes:

  • Los campos que un sensor o firmware no reporta se omiten, no se envían como null. Lee de forma defensiva.
  • timestamp es tiempo Unix en segundos, no en milisegundos.

Variables comunes a todos los sensores

Nombre de variable Descripción
dataType Discriminador del mensaje: stateupdate, bandsUpdate, collection, wiredOveralls, wiredCollection o customUnitStateUpdate. collection corresponde a formas de onda e imágenes térmicas; cualquier otra actualización es stateupdate.
type Tipo de sensor (ver la tabla siguiente).
phantomCode Número de serie del sensor. Nota: los mensajes collection de vibración usan serialNumber en su lugar.
gwSerial Número de serie del gateway.
timestamp El momento de la medición, en segundos desde 1970.
friendlyName El nombre asignado al sensor en la consola. Se omite si no tiene ninguno.
seq Contador de secuencia de actualizaciones del sensor. Vuelve a cero en 255; un salto indica que se perdieron anuncios por el aire.
battery Voltaje de la batería en volts.
batteryType Tipo de batería (ver la tabla siguiente).
temperature Temperatura interna del sensor (en grados Celsius).
updateInterval Intervalo de actualización configurado en el sensor, en segundos.
txPower Potencia de transmisión del radio, en dBm.
advFlags Campo de bits con las banderas internas de anuncio del sensor.
version Versión del firmware.
rssi Intensidad de señal del sensor, en dBm (solo en stateupdate).
Código de sensor Tipo de sensor
3 Acelerómetro triaxial (KX222, rango alto)
5 Acelerómetro triaxial (KX122, rango bajo)
6 Acelerómetro triaxial (KX134)
7 Triaxial universal (vibración + termopar + corriente)
8 Triaxial PHANTOM® Gen 4, rango alto
9 Triaxial PHANTOM® Gen 4, rango bajo
10 Cámara termográfica
12 Repetidor
14 PHANTOM® MAX, rango alto
15 PHANTOM® MAX, rango bajo
20 Termopar
21 Termopar v2
22 Termopar v3
25 Temperatura infrarroja
26 Nodo de sensores 4-20 mA
27 Voltímetro (0-10 VCD)
30 Módulo de corriente v1
31 Contacto seco
32 Módulo de corriente v2 (4 canales)
40 Velocidad (módulo RPM)
50 Distancia
60 Módulo de propósito general
202 Display
batteryType Batería
1 ⅙ D
2 AAA
3 CR2032
4 CR2477
5 AA
6 D

Estas son las propiedades incluidas para cada tipo de sensor.

Acelerómetro triaxial (3, 5, 6, 8 y 9)

Nombre de variable Descripción
rms Arreglo de tres flotantes con el RMS de velocidad en mm/s correspondiente a cada eje.
arms Arreglo de tres flotantes con el RMS de aceleración en g correspondiente a cada eje.
minRMSFreq Límite inferior de la banda del RMS de velocidad, en Hz.
maxRMSFreq Límite superior de la banda del RMS de velocidad, en Hz.
minRMSFreqAccel Límite inferior de la banda del RMS de aceleración, en Hz.
maxRMSFreqAccel Límite superior de la banda del RMS de aceleración, en Hz.
range Rango de fondo de escala configurado actualmente en el acelerómetro, en g.
magneticspeed Solo PHANTOM® MAX (14 y 15): velocidad de giro obtenida magnéticamente, en Hz.

Ejemplo de mensaje stateupdate:

{
  "rssi": -63,
  "type": 6,
  "version": 195,
  "phantomCode": 40217,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231043,
  "dataType": "stateupdate",
  "friendlyName": "Bomba 3 - Motor LA",
  "seq": 184,
  "advFlags": 0,
  "batteryType": 1,
  "battery": 3.61,
  "temperature": 41.25,
  "updateInterval": 300,
  "txPower": 4,
  "minRMSFreq": 10,
  "maxRMSFreq": 1000,
  "rms": [1.42, 0.88, 2.07],
  "range": 16,
  "recordingSettings": 3,
  "minRMSFreqAccel": 1000,
  "maxRMSFreqAccel": 10000,
  "arms": [0.412, 0.298, 0.677]
}

Acelerómetro triaxial con dataType “collection”

Nombre de variable Descripción
serialNumber Número de serie del sensor. Este mensaje usa serialNumber, no phantomCode.
sampleRate Frecuencia de muestreo con la que se tomó la medición, en Hz.
data Contiene los datos de la forma de onda. Incluye tres arreglos, uno por eje. Dos de los arreglos pueden venir vacíos si se seleccionó un modo de un solo eje. Los números del arreglo están en G (9.8 m/s²).
isAlarm true cuando la grabación se disparó por una condición de alarma.
rpm Velocidad de giro al momento de la captura. Se omite si no está disponible.
temperature Temperatura interna del sensor en la captura, en grados Celsius. La reportan los sensores que la miden.
{
  "serialNumber": 40217,
  "sampleRate": 3200,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231043,
  "type": 6,
  "dataType": "collection",
  "friendlyName": "Bomba 3 - Motor LA",
  "isAlarm": false,
  "rpm": 1478,
  "temperature": 41.25,
  "data": [
    [0.0123, -0.0044, 0.0187],
    [0.0091, 0.0102, -0.0058],
    [-0.021, 0.0176, 0.0031]
  ]
}

Los tres arreglos de muestras están recortados en este ejemplo; un mensaje real lleva el registro completo. El número de muestras por eje es data[n].length, y la duración del registro en segundos es data[n].length / sampleRate.

Mensaje de bandas de frecuencia (dataType “bandsUpdate”)

Los sensores triaxiales que anuncian datos extendidos de bandas publican un bandsUpdate junto con la actualización de estado.

Nombre de variable Descripción
rpmMin / rpmMax Ventana de velocidad de giro contra la que se evaluaron las bandas.
bands[].min / .max Límites de la banda, expresados en unit: hz (enteros) u orders (un decimal).
bands[].measurement velocity o acceleration.
bands[].output Detector aplicado a la banda (rms, peak, …).
bands[].values Resultado por eje, { x, y, z }.
bands[].valueUnit mm/s para bandas de velocidad, mg para bandas de aceleración.
{
  "dataType": "bandsUpdate",
  "serialNumber": 40217,
  "phantomCode": 40217,
  "type": 6,
  "version": 195,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231043,
  "seq": 184,
  "rpmMin": 1450,
  "rpmMax": 1495,
  "bands": [
    {
      "min": 1.0,
      "max": 2.5,
      "measurement": "velocity",
      "unit": "orders",
      "output": "rms",
      "values": { "x": 1.12, "y": 0.74, "z": 1.88 },
      "valueUnit": "mm/s"
    }
  ]
}

Mensaje de la cámara termográfica (10)

Con dataType: "stateupdate" la cámara reporta avgImageTemperature, la temperatura promedio de la imagen en grados Celsius.

Con dataType: "collection" se publica la imagen completa:

Nombre de variable Descripción
columns Ancho de la imagen en píxeles.
rows Alto de la imagen en píxeles.
frames Número de cuadros en el mensaje.
frameRate Cuadros por segundo de la captura.
data Arreglo de frames imágenes; cada imagen es un arreglo de rows filas; cada fila contiene columns temperaturas en Celsius.
{
  "phantomCode": 60912,
  "serialNumber": 60912,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231400,
  "type": 10,
  "dataType": "collection",
  "columns": 32,
  "rows": 24,
  "frames": 1,
  "frameRate": 1,
  "data": [
    [
      [24.31, 24.55, 25.02],
      [24.28, 24.61, 25.14]
    ]
  ]
}

Mensaje del nodo de temperatura por termopar (20, 21 y 22)

Nombre de variable Descripción
tcTemperature Arreglo de tres flotantes con la temperatura de cada canal de termopar en grados Celsius.

Mensaje del nodo de temperatura infrarroja (25)

Nombre de variable Descripción
ambientTemperature Temperatura ambiente medida por el sensor infrarrojo, en grados Celsius.
objectTemperature Temperatura del objeto al que apunta el sensor infrarrojo, en grados Celsius.
emissivity Emisividad configurada para el objeto medido.

Sensor 4-20 mA (26) y voltímetro (27)

Nombre de variable Descripción
voltage Arreglo de cuatro flotantes con el voltaje medido en cada canal.

Sensor de velocidad (RPM) (40)

Nombre de variable Descripción
rpm Valor flotante con la velocidad actual en RPM.
rpmTimeout Segundos sin pulso tras los cuales el sensor reporta velocidad cero.

Sensor de distancia (50)

Nombre de variable Descripción
distance Distancia medida, en mm.

Módulo de propósito general (60)

Nombre de variable Descripción
rms Arreglo de flotantes con el RMS por eje. Velocidad en mm/s, o aceleración en g, según gpFlags.
sensitivity Sensibilidad configurada de la sonda, en mV/g.
gpFlags Campo de bits. El bit 0 indica si rms es una medición de velocidad o de aceleración.

Sensor de corriente (30 y 32)

Nombre de variable Descripción
instCurrent Arreglo de cuatro flotantes con la corriente instantánea de cada uno de los cuatro canales del sensor, en amperes.
averageCurrent Arreglo de cuatro flotantes con la corriente promedio de cada uno de los cuatro canales del sensor, en amperes.
minCurrent Arreglo de cuatro flotantes con la corriente mínima de cada uno de los cuatro canales del sensor, en amperes.
maxCurrent Arreglo de cuatro flotantes con la corriente máxima de cada uno de los cuatro canales del sensor, en amperes.
accumulatedCurrent Arreglo de cuatro flotantes con la corriente acumulada de cada uno de los cuatro canales del sensor.
accumulatedStart Inicio de la ventana de acumulación, en segundos desde 1970.
accumulatedEnd Fin de la ventana de acumulación, en segundos desde 1970.
currentProbeType Tipo de sonda configurada en cada canal.
currentOffsets Offset de calibración aplicado a cada canal.
currentMultiplier Multiplicador de calibración aplicado a cada canal.
{
  "dataType": "stateupdate",
  "type": 32,
  "phantomCode": 51844,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231102,
  "rssi": -71,
  "version": 118,
  "battery": 3.58,
  "batteryType": 4,
  "temperature": 33.1,
  "instCurrent": [12.4, 12.1, 12.8, 0.0],
  "averageCurrent": [12.3, 12.0, 12.7, 0.0],
  "minCurrent": [11.9, 11.6, 12.2, 0.0],
  "maxCurrent": [13.1, 12.9, 13.4, 0.0],
  "accumulatedCurrent": [842.5, 838.1, 851.9, 0.0],
  "accumulatedStart": 1753553200,
  "accumulatedEnd": 1756231102
}

Sensor de contactos secos (31)

Nombre de variable Descripción
dryContactsState Arreglo booleano de tamaño 4 con el estado de la entrada. True significa contacto cerrado y false significa abierto.
debounce Tiempo de antirrebote aplicado a las entradas.

Canales cableados del DEFIANT™

Los valores globales de los canales cableados se publican según la cadencia de Send wired channels overalls (Never, As fast as possible, o limitada por Wired overall send timeout). En el payload, wiredChannel empieza en 1, y solo se incluyen los globales que realmente se calculan para ese canal.

{
  "dataType": "wiredOveralls",
  "wiredChannel": 1,
  "gwSerial": "EIDF98765",
  "timestamp": 1756231500,
  "sensorType": "accelerometer",
  "friendlyName": "Ventilador 12 - Interior",
  "accel_rms": 0.482,
  "velocity_rms": 2.14,
  "displacement_rms": 18.7,
  "gE": 0.93,
  "rpm": 1786,
  "accel_truepeak": 1.84,
  "accel_peaktopeak": 3.52,
  "accel_kurtosis": 3.11
}

Claves disponibles:

Grupo Claves
Aceleración accel_rms, accel_truepeak, accel_peaktopeak, accel_lowfreq, accel_medfreq, accel_highfreq, accel_kurtosis, accel_skewness
Velocidad velocity_rms, velocity_truepeak, velocity_peaktopeak, velocity_lowfreq, velocity_medfreq, velocity_highfreq, velocity_kurtosis, velocity_skewness
Envolvente de aceleración gE, ge_truepeak, ge_peaktopeak, ge_lowfreq, ge_medfreq, ge_highfreq, ge_kurtosis, ge_skewness
Desplazamiento displacement_rms, displacement_truepeak, displacement_peaktopeak, displacement_offset
Velocidad de giro rpm
Analógicas / discretas voltage_discrete, voltage_average, discrete_value
Fase entre canales phase_channel_1phase_channel_16

Mientras el DEFIANT™ está en modo proyecto (ruta/grabación), la publicación de wiredOveralls queda suspendida.

Las formas de onda cableadas se publican como wiredCollection, con un solo arreglo data ya escalado por la calibración del canal y la sensibilidad del sensor:

{
  "dataType": "wiredCollection",
  "wiredChannel": 1,
  "gwSerial": "EIDF98765",
  "timestamp": 1756231500,
  "sensorType": "accelerometer",
  "sampleRate": 25600,
  "data": [0.0041, -0.0093, 0.0128]
}

Tags de Modbus y unidades personalizadas

Los valores que el gateway lee de dispositivos Modbus de terceros, o de unidades personalizadas cableadas, se republican en MQTT como customUnitStateUpdate. units y values son arreglos paralelos, y se agrega un campo wiredChannel cuando el valor proviene de un canal cableado del DEFIANT™.

{
  "dataType": "customUnitStateUpdate",
  "gwSerial": "EIGW12345",
  "timestamp": 1756231600,
  "source": "gateway",
  "clientName": "PLC del compresor",
  "tagName": "DischargePressure",
  "functionType": "holdingRegister",
  "address": 40012,
  "byteOrder": "ABCD",
  "tagDataType": "float32",
  "machineCode": "COMP-01",
  "pointIndex": 2,
  "units": ["bar"],
  "values": [7.42]
}

Compresión del payload

La opción Compress (gzip) payload envuelve cada payload JSON en un flujo gzip antes de publicarlo, lo que normalmente reduce los mensajes de forma de onda entre 60 y 80 %. El payload pasa entonces a ser bytes gzip en crudo, no texto, así que hay que descomprimirlo antes de parsearlo:

import gzip, json
import paho.mqtt.client as mqtt

def on_message(client, userdata, msg):
    raw = msg.payload
    if raw[:2] == b"\x1f\x8b":            # número mágico de gzip
        raw = gzip.decompress(raw)
    data = json.loads(raw)
    print(data["dataType"], data.get("phantomCode") or data.get("serialNumber"))

client = mqtt.Client()
client.username_pw_set("phantom", "tu-contrasena")
client.tls_set()                          # requerido para mqtts://
client.on_message = on_message
client.connect("broker.example.com", 8883)
client.subscribe("phantom/#", qos=1)
client.loop_forever()

Deja la compresión desactivada si tu plataforma no puede descomprimir payloads; muchos lectores de tags JSON de SCADA no pueden.

Administración remota por MQTT

Marcar Allow Gateway management through MQTT hace que el gateway se suscriba al Subscribe topic y actúe sobre los comandos JSON que reciba ahí. Las respuestas se publican en el tópico de publicación normal, con /<gwSerial> añadido cuando Append serial está activo. Todo comando debe llevar el número de serie del gateway destino en gwSerial; un gateway ignora los comandos dirigidos a otro número de serie.

Solicitar una forma de onda a un sensor específico:

{
  "type": "requestWaveform",
  "gwSerial": "EIGW12345",
  "phantomCode": 40217
}

Llamar a la API de administración del Gateway:

{
  "type": "observeerequest",
  "gwSerial": "EIGW12345",
  "action": "getstate"
}

El gateway responde con los mismos documentos JSON que recibe la consola de administración por WebSocket, enriquecidos con un campo gwSerial para que puedas enrutar las respuestas. El vocabulario de action cubre todas las funciones de la consola, incluidas getstate, deviceinfo, setbasicconfig, setfriendlyname, pair, unpair, restart, startfwupdate, getofflinefiles y wiredcollectnow. Contacta a un representante de soporte de ERBESSD INSTRUMENTS® para recibir una copia de la documentación de la API de administración.

Este es un canal de control privilegiado. Habilítalo solo en un broker autenticado y protegido con TLS, con una ACL que restrinja quién puede publicar en el tópico de suscripción. Déjalo deshabilitado si solo necesitas telemetría.

Versión de MQTT y formato del payload

Versión de MQTT. El cliente del gateway se conecta en el nivel de protocolo 4, es decir MQTT 3.1.1. Esa es la base interoperable: los brokers MQTT 5.0 aceptan clientes 3.1.1, así que una infraestructura MQTT 5.0 funciona sin cambios. Lo que la sesión del gateway no usa son las funciones exclusivas de 5.0, como suscripciones compartidas, alias de tópico, propiedades de correlación petición/respuesta, expiración de sesión y códigos de razón. Si las necesitas más adelante en la cadena, termina la sesión 3.1.1 del gateway en tu broker y habla 5.0 entre el broker y tus aplicaciones.

¿El payload es propietario? No. Es JSON abierto con nombres de campo estables, documentado por completo arriba. No hace falta ningún registro de esquemas, licencia ni SDK para leerlo.

Inicio rápido con mosquitto_sub

mosquitto_sub -h broker.example.com -p 8883 --cafile /etc/ssl/certs/ca-certificates.crt -u phantom -P "tu-contrasena" -t "phantom/#" -q 1 -v

Filtra únicamente las actualizaciones de estado, que son ligeras:

mosquitto_sub -h broker.example.com -t "phantom/+/+/stateupdate" -v