Analizador de protocolos — Arquitectura, interfaces y guia de implementacion · v4.0 · s18 · 2026-04-06
Analyzer1 es el instrumento de diagnostico de protocolos de la plataforma LRU. Captura, decodifica e inspecciona trafico de cualquier protocolo — desde MQTT IoT hasta ARINC 429 de avionica — con una interfaz unificada.
ProtocolAdapter. Cada protocolo es un modulo independiente. Anadir un protocolo = implementar un adaptador + registrarlo.
| Modo | Ruta / Mecanismo | Descripcion |
|---|---|---|
| Pagina | /Analyzer1 | Pantalla completa |
| Overlay | Analyzer1Overlay | Flotante arrastrable (Escape cierra) |
| PanelGrid | Panel analyzer | Embebido en Sim1, modo compacto |
interface ProtocolAdapter {
readonly protocolId: string;
readonly name: string;
readonly family: ProtocolFamily; // 'aviation' | 'industrial' | 'iot'
decode(raw: string | ArrayBuffer): DecodedFrame;
inspect(raw: string | ArrayBuffer): string;
canDecode(raw: string | ArrayBuffer): boolean;
}
| Tipo | Fuente | Estado | Hook |
|---|---|---|---|
mqtt-debugbus | DebugBus canales mqtt+comms | ✓ | useMqttTap |
mqtt-sim | MqttSimulator (3 devices) | ✓ | useMqttSimTap |
arinc429-sim | Arinc429Simulator → Sim1 | ✓ | useArinc429Tap |
ws-real | CommsManager subscribe('*') channel ws* | ✓ s18 | useWsTap |
ws-sim | WebSocketSimulator (6 generators) | ✓ s18 | useWsSimTap |
ble | CommsManager channel ble* | Planificado | — |
interface CapturedFrame {
id: number; timestamp: number; tapPointId: string;
protocolId: string; direction: 'rx' | 'tx' | 'internal';
raw: string; decoded?: DecodedFrame; size: number; starred?: boolean;
}
interface AnalyzerState {
capturing: boolean; frames: CapturedFrame[]; maxFrames: number;
selectedFrameId: number | null; activeTapPoints: string[];
filter: string; autoScroll: boolean;
stats: { totalFrames: number; framesPerSec: number; bytesTotal: number; };
}
9 protocolos definidos, 3 implementados:
Decode 32-bit words: Label 8b bit-reversed, SDI 2b, Data 19b, SSM 2b, Parity 1b odd. Tabla A320_LABELS 22 labels con escala/offset/unidad/ATA. Simulador con Sim1 link via window.Sim1Debug.getValues().
Parseo topics <red>/<id>/<dir>/<canal>, clasificacion 6 tipos (telemetry/rpc/status/command/event/unknown), deteccion unidades, meta cache getMqttMeta(). 3 dispositivos simulados (esp01 Air Data, esp02 Engine, esp03 Flight Control). Tap real via DebugBus + tap simulado.
Decode de frames WS intercambiados con Node-RED y servidores WebSocket. Clasificacion 8 tipos:
| Tipo | Color | Icono | Deteccion |
|---|---|---|---|
| data | #2ecc71 | 📊 | Tiene topic+payload, o campos numericos |
| subscribe | #3498db | 🔔 | type: 'subscribe' |
| unsubscribe | #7c8098 | 🔕 | type: 'unsubscribe' |
| ping/pong | #95a5a6 | ↔ | Texto ping/pong o type: 'ping' |
| command | #e74c3c | ⌘ | _execCommand, command, action |
| event | #9b59b6 | ⚡ | type: 'event', event field |
| raw | #7c8098 | · | Sin coincidencia / no-JSON |
6 generadores en simulator.ts (182 lin): sensor relay (Sim1 link), status broadcast, _execCommand, system events, subscribe, ping/pong. Intervalo base 600ms.
useWsTap: intercepta CommsManager con subscribe('*') filtrando channel.startsWith('ws') + captura publishes salientes via onPublish. Patron reutilizable para BLE (channel.startsWith('ble')).
useWsSimTap: WebSocketSimulator genera trafico sin servidor. Mismo patron que useMqttSimTap.
898 lineas. 3 branches de rendering segun protocolo, con componentes compartidos para IoT (MQTT + WS).
Binary view coloreada (32 bits, 5 campos), Octal view (labels octal), HexDump con bytes coloreados, campos decodificados con cross-highlight bidireccional.
Topic segmentado en cajas coloreadas por segmento. Badge tipo (telemetry/rpc/status/command/event). Campos organizados: Routing / Datos (barras magnitud) / Otros. JSON syntax highlight (keys cyan, strings verde, numbers ambar, booleans purpura). Deteccion timestamps → formato HH:MM:SS.mmm.
Badge tipo coloreado (8 tipos WS). Topic segmentado si presente. Campos con colores semanticos: IDs cyan, IPs verde, commands rojo, status verde, booleans verde/rojo. JSON syntax highlight. Reutiliza componentes IoT compartidos.
| Componente | Funcion |
|---|---|
MqttFieldsView | Organiza campos en Routing / Datos / Otros con colores semanticos |
MqttNumericField | Campo numerico con barra magnitud, deteccion timestamp |
JsonHighlight | JSON syntax highlight con regex (keys, strings, numbers, booleans, null) |
fieldColor() | Colores semanticos por nombre de campo (IDs, IPs, status, commands, timestamps) |
isTimestamp() | Heuristica: por nombre (ts, timestamp) y por rango valor (>1e12) |
Refactorizado de monolito 673 lin a carpeta bottom/ con 10 ficheros (2235 lin). Orquestador delgado (171 lin). 6 tabs:
| Tab | Fichero | Lineas | Protocolo | Descripcion |
|---|---|---|---|---|
| Waveform/Flow | WaveformView / MqttFlowView / WsFlowView | 280+121+202 | Adaptativo | A429: bipolar RZ multi-word. MQTT: pub/sub. WS: bidireccional |
| Timeline | TimelineView | 353 | Todos | Zoom, pan, minimap, tooltips, rafagas |
| Constellation | TopicConstellation | 283 | MQTT | Grafo topics, parpadeo, click filtra |
| Latency | LatencyAnalyzer | 251 | Todos | Histograma, estadisticas, outliers |
| Diff | PayloadDiff | 274 | Todos | Side-by-side campos cambiados |
| Stats | StatsView | 216 | Todos | Donut, sparkline, top topics |
Multi-word (hasta 4 consecutivas), timing real (toggle 100kb/12.5kb), gaps null (4 bit-periods), escala temporal µs, cursor de medida (click A + click B → delta µs).
Diagrama pub/sub: Publisher → Broker → Subscriber. Topic segmentado, badge tipo, barras valores numericos.
Diagrama bidireccional PWA ↔ Node-RED. Badge WS en conexion. Badge tipo debajo. Node-RED con mini logo "N" y URL :1880. Topic segmentado si presente. Ping/pong con texto especial. Barras valores (timestamps excluidos).
Zoom scroll wheel (1x-20x), drag horizontal pan, mini-map con viewport, tooltips hover (protocolo, timestamp, summary, dir, size), agrupacion rafagas (<50ms), boton Reset.
Grafo SVG: nodos = segmentos unicos topics MQTT, aristas = padre/hijo. Tamano proporcional a frecuencia. Parpadeo reciente (<2s). Click filtra sub-arbol. Solo visible si hay frames MQTT.
Histograma latencia inter-frame. Filtro por protocolo. 8 stats: Min, Max, Avg, Median, P95, σ, Jitter, Outliers. Lineas media (verde) y P95 (ambar). Barras rojas para outliers (>2σ). Alerta jitter >100ms.
Frame seleccionado vs anterior/siguiente del mismo protocolo. Campos: same (gris), modified (amarillo+flecha), added (verde), removed (rojo tachado). Toggle prev/next.
Donut distribucion protocolos, barra TX/RX/Internal, avg payload size, sparkline throughput 20s, top 5 topics MQTT.
src/pages/Analyzer1/
├── index.ts — Re-export
├── Analyzer1.tsx — Shell + play por protocolo (s18, 392 lin)
├── Analyzer1Overlay.tsx — Overlay arrastrable (portal)
├── FrameInspector.tsx — 3 branches A429/MQTT/WS (s18, 898 lin)
├── AnalyzerBottomPanel.tsx — Orquestador 6 tabs (s18, 171 lin)
├── analyzer1.css — Estilos + MQTT/WS inspector (s18, 534 lin)
├── types.ts — ProtocolAdapter, TapPoint, Frame, State
├── bottom/ — Visualizaciones BottomPanel (s18)
│ ├── index.ts — Barrel (13 lin)
│ ├── constants.ts — PROTO_COLORS, ARINC429_RANGES (42 lin)
│ ├── WaveformView.tsx — Waveform A429 multi-word (280 lin)
│ ├── MqttFlowView.tsx — MQTT pub/sub flow (121 lin)
│ ├── WsFlowView.tsx — WS bidireccional flow (202 lin)
│ ├── TimelineView.tsx — Timeline zoom/pan/minimap (353 lin)
│ ├── StatsView.tsx — Donut + sparkline (216 lin)
│ ├── TopicConstellation.tsx — Grafo topics MQTT (283 lin)
│ ├── LatencyAnalyzer.tsx — Histograma latencia (251 lin)
│ └── PayloadDiff.tsx — Diff side-by-side (274 lin)
└── protocols/
├── index.ts — Catalogo + registry (79 lin)
├── arinc429/
│ ├── index.ts, adapter.ts (212), labels.ts (67), simulator.ts (151), tap.ts (69)
├── mqtt/
│ ├── index.ts, adapter.ts (309), simulator.ts (224), tap.ts (167)
└── websocket/ — s18
├── index.ts (9), adapter.ts (302), simulator.ts (182), tap.ts (159)
| Zona | Funcion |
|---|---|
| Header | Logo AN₁, capturar/parar, limpiar, estadisticas, auto-scroll |
| Sidebar | 3 protocolos implementados con ▶/⏸ + tap points toggleables |
| Frame List | Colores: A429 rojo, MQTT azul, WS verde. Filtro texto |
| FrameInspector | Branch por protocolo. Topic coloreado, badges, barras, JSON highlight |
| BottomPanel | 6 tabs. Badge protocolo. Colapsable |
Analyzer1Provider en App.tsx. Ruta /Analyzer1. Panel analyzer en PanelGrid (panel 11). CSS vars --sim1-*. Los 3 simuladores leen de window.Sim1Debug.getValues() para reflejar valores reales de Sim1.
| Sprint | Item | Sesion |
|---|---|---|
| S3 | Shell Analyzer1 (triple vida, ProtocolAdapter, MQTT tap) | s15 |
| S4 | ARINC 429 Adapter + FrameInspector + Waveform + Sim1 link | s16 |
| S4 | MQTT Adapter enriquecido + Simulador 3 devices + Flow + Timeline + Stats | s17 |
| S4 | BottomPanel refactor modular (bottom/ 10 ficheros, 6 tabs) | s18 |
| S4 | Timeline mejorada (zoom/pan/minimap/tooltips/rafagas) | s18 |
| S4 | Waveform real ARINC 429 (multi-word, timing µs, cursor medida) | s18 |
| S4 | TopicConstellation + LatencyAnalyzer + PayloadDiff | s18 |
| S4 | WebSocket Adapter completo (protocolo #3: decode, sim, tap real+sim, flow) | s18 |
| S4 | FrameInspector MQTT/WS enriquecido (topic, badge, barras, JSON highlight) | s18 |
| Item | Prioridad |
|---|---|
| BLE Adapter (protocolo #4, tap real via CommsManager) | Media |
| Ampliar labels A320 (Landing Gear, APU, Hydraulics, TCAS, GPWS) | Baja |
| Touch para Timeline/Waveform (PanelGrid mobile) | Baja |
| TrafficMonitor dashboard, OsiDrill, encode() | S5 |
| MIL-1553, Modbus, OPC UA, AFDX adapters | S5-S6 |
| Tap points reales: Serial, BLE directos | S6 |
| FDR integration (RabbitMQ Streams replay) | S6 |
LRU Platform · Analyzer1 Architecture · lru_analyzer1_architecture_v4.0_s18.html · s18 · 2026-04-06