Interfaz WebSocket¶
Canal entre el simulador y los navegadores conectados. Transporta telemetría de estado, registro de eventos y las órdenes del operador.
No es un contrato con otro equipo
A diferencia de RD100S-ENC-UDP, las dos partes de este canal son de este proyecto. Puede evolucionar sin ceremonia de versionado, siempre que servidor e interfaz se desplieguen juntos.
Dos flujos con políticas opuestas¶
Es la decisión de fondo de esta interfaz (D-13).
| Telemetría de estado | Registro de eventos | |
|---|---|---|
| Cadencia | 10 Hz, snapshot completo | según ocurran |
| Pérdida | tolerada | inaceptable |
| Recuperación | ninguna, el siguiente snapshot corrige | por número de secuencia |
| Orden | irrelevante | estricto |
| Persistencia | ninguna | en disco antes de enviar |
Mezclarlos bajo una sola política obliga a sacrificar uno: o se retiene telemetría caduca esperando confirmación, o se pierden eventos que son la evidencia con la que se discutirá un fallo con el equipo del controlador.
Mensajes del servidor¶
state¶
Snapshot completo a 10 Hz. Se descarta si el cliente no drena (D-12).
{
"type": "state",
"t_us": 128394821,
"signals": {
"tx.hv_voltage": { "v": 24.8, "m": "auto", "q": "ok" },
"tx.interlock_ok_status": { "v": false, "m": "forced", "q": "ok", "by": "op-2" }
}
}
Snapshot completo, no delta. Un delta exigiría garantía de entrega, que es justo lo que este canal no da. El coste de reenviar todas las señales a 10 Hz es asumible para el orden de magnitud de un radar.
event¶
Numerado y estrictamente ordenado.
{
"type": "event",
"n": 4471,
"t_us": 128394503,
"kind": "force",
"signal": "tx.interlock_ok_status",
"actor": "op-2",
"payload": { "value": false, "shadow": true }
}
session¶
Enviado al conectar y en cada recarga de configuración: identificador de sesión, hash del JSON aplicado, hora de pared del arranque, número de operadores conectados.
metrics¶
Métricas de calidad de enlace, 1 Hz: transacciones Modbus por segundo, latencia de petición a respuesta, paquetes UDP emitidos y descartados, y desviación real de la cadencia respecto a la nominal. Sirven para responder si un fallo fue del controlador o del banco.
Mensajes del cliente¶
type |
Efecto |
|---|---|
force |
Pone una señal en modo forzado con el valor dado |
release |
Devuelve la señal a automático, con salto instantáneo |
propagation |
Corta o restituye la propagación aguas abajo de una señal |
degrade |
Activa una degradación del stream UDP |
scenario |
Arranca o aborta un escenario |
resume_from |
Pide los eventos posteriores a un número de secuencia |
Todo mensaje del cliente lleva actor. No es opcional: con la demo compartiendo estado, un forzado anónimo hace el registro inservible como evidencia.
El cliente pide, no decide
Un force es una petición. El instante que cuenta es aquel en que el simulador aplica el
cambio, y ese es el que va al evento. El momento del clic no es medible por el retardo
variable del túnel, y por eso las aserciones se evalúan en el simulador
(D-14).
Reconexión¶
Al reconectar, el cliente envía resume_from con el último n recibido y el servidor reenvía
los eventos que falten desde SQLite. La telemetría no se recupera: el primer state posterior
ya es correcto por construcción.
Si el hueco es mayor que lo retenido, el servidor responde con un evento de discontinuidad explícito. Un hueco silencioso en el registro es peor que un hueco declarado, porque invalida la traza entera sin avisar.
Autenticación¶
Cloudflare Access está delante (Despliegue). El identificador de actor se deriva de la identidad que Access propaga; el simulador no implementa autenticación propia y no debe hacerlo.