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.

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. timestampes 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_1 … phase_channel_16 |
Mientras el DEFIANT™ está en modo proyecto (ruta/grabación), la publicación de
wiredOverallsqueda 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