Aller au contenu

Communication

ProtocoleUsageLatencePortée
ESP-NOWNodes ↔ Coordinateur / ESP32-S3 USB bridge< 10 ms~50 m intérieur
WebSocket natifSimPilot ↔ SimServer< 50 msWiFi
WebSocketSimPilot ↔ Coordinateur (mode simple)< 50 msWiFi AP
MQTTBus d’événements inter-services (Docker)< 10 msLocalhost / réseau
WebRTCSimCam (smartphone) → SimServer~100 msWiFi
RTSPCaméras IP PoE → SimServer (go2rtc)~200 msEthernet
HLSSimServer → Navigateur (débriefing)2-6 sWiFi / HTTP
USB série (JSON lines)ESP32-S3 USB bridge → Machine hôte< 5 msCâble USB-C
REST APISimPilot / SimServer → SaaS (cloud)VariableInternet

Sans SimServer, le coordinateur ESP32-S3 est le hub central.

graph TB
Coord["Coordinateur ESP32-S3"]
Coord -->|WiFi AP<br/>192.168.4.1| SimPilot["Tablette (SimPilot)"]
Coord <-->|ESP-NOW<br/>broadcast| Nodes["Nodes (DAE, Scope)"]
Coord -->|WebSocket<br/>port 81| Debug["Page web debug"]
style Coord fill:#9b59b6,color:#fff
style SimPilot fill:#50b87a,color:#fff
style Nodes fill:#d94a4a,color:#fff

Protocole principal entre les nodes et le coordinateur / ESP32-S3 USB bridge.

  • Pair-à-pair, sans connexion WiFi requise
  • Latence typique : < 10 ms
  • Portée : ~50 m en intérieur
  • Taille max : 250 octets par message
  • Pas de garantie de livraison (best effort)

3 kits peuvent fonctionner simultanément dans la même salle :

KitCanal WiFiGroup ID
Kit 111
Kit 262
Kit 3113
[Magic 0x53][Version][Type][Group][Payload JSON max 246 bytes]

Voir SimComm pour le détail du protocole.

Communication bidirectionnelle en temps réel entre le SimPilot et SimServer via WebSocket natif (pas de bibliothèque SocketIO). La connexion passe par Caddy (TLS) en production.

// Mise à jour des paramètres vitaux
{ "event": "vitals:update", "data": { "hr": 72, "spo2": 98, "nibp": "120/80", "rr": 16 } }
// État du scénario
{ "event": "scenario:state", "data": { "state": "running", "step": 3, "elapsed": 180 } }
// Liste des dispositifs connectés
{ "event": "devices:update", "data": { "devices": [...] } }
// État d'enregistrement
{ "event": "recording:state", "data": { "recording": true } }
// Liste des caméras
{ "event": "cameras:update", "data": { "cameras": [...] } }
// Démarrer un scénario
{ "event": "scenario:start", "data": { "scenarioId": "acr-fv-adulte" } }
// Modifier un paramètre vital
{ "event": "vitals:override", "data": { "param": "hr", "value": 120 } }
// Déclencher un événement
{ "event": "event:trigger", "data": { "type": "shock", "energy": 200 } }
// Poser un marqueur
{ "event": "marker:add", "data": { "label": "Intubation", "timestamp": 1234567890 } }

En mode simple (sans SimServer), le SimPilot communique avec le coordinateur ESP32-S3 via WebSocket natif.

ws://192.168.4.1:81
// SimPilot → Coordinateur
{ "cmd": "start", "scenario": "acr-fv-adulte" }
{ "cmd": "trigger", "event": "shock" }
{ "cmd": "override", "param": "hr", "value": 120 }
// Coordinateur → SimPilot
{ "type": "vitals", "hr": 72, "spo2": 98, "rr": 16 }
{ "type": "device", "id": "dae-01", "state": "ANALYZING" }
{ "type": "event", "name": "shock_delivered", "energy": 200 }

Communication entre l’ESP32-S3 USB bridge et la machine hôte via câble USB-C. Le bridge est un petit PCB 2 couches (~40x25 mm, ~5 EUR) qui fait le pont entre le réseau ESP-NOW et SimServer.

  • Interface : USB-C (USB CDC-ACM, apparaît comme /dev/ttyACM0)
  • Débit : 115200 baud
  • Format : JSON lines (une ligne JSON par message, terminée par \n)
  • Direction : bidirectionnel
// ESP32-S3 → SimServer (paramètres vitaux reçus d'un node)
{"type":"vitals","device":"dinamap-01","hr":72,"spo2":98,"nibp":"120/80","rr":16}
// ESP32-S3 → SimServer (annonce d'un dispositif)
{"type":"announce","device":"dae-01","deviceType":"dae","capabilities":["shock","analyze"]}
// ESP32-S3 → SimServer (événement d'un node)
{"type":"event","device":"dae-01","name":"shock_delivered","energy":200}
// SimServer → ESP32-S3 (commande à relayer via ESP-NOW)
{"cmd":"start","scenario":"acr-fv-adulte","group":1}
{"cmd":"override","param":"hr","value":120,"group":1}
{"cmd":"stop","group":1}

Le broker Eclipse Mosquitto assure la communication entre les services Docker de SimServer. Il sert de bus d’événements interne.

  • Découplage entre les services (API, enregistrement, vidéo, bridge USB)
  • Publication/souscription pour les événements de simulation
  • Persistance des messages QoS 1 pour la fiabilité
TopicÉditeurDescription
sim/vitals/{deviceId}USB bridge serviceParamètres vitaux en temps réel
sim/devicesUSB bridge serviceAnnonces et état des dispositifs
sim/scenario/stateAPIÉtat du scénario (running, paused, stopped)
sim/recording/stateAPIÉtat d’enregistrement
sim/commands/{group}APICommandes à relayer aux nodes via ESP-NOW
sim/cameras/{cameraId}go2rtc / APIÉtat des flux caméras

Les smartphones envoient leur flux vidéo à SimServer via WebRTC (préféré).

// SimCam → SimServer (enregistrement)
{ "event": "camera:register", "data": { "deviceId": "phone-01", "capabilities": {...} } }
// SimServer → SimCam (configuration)
{ "event": "camera:config", "data": { "resolution": "720p", "framerate": 30 } }
// SimCam → SimServer (état)
{ "event": "camera:status", "data": { "battery": 85, "streaming": true } }

La signalisation WebRTC (offre SDP, réponse SDP, candidats ICE) passe par la connexion WebSocket entre SimCam et SimServer.

En mode simple, le coordinateur expose une API REST minimale :

EndpointMéthodeDescription
/api/stateGETÉtat courant de la simulation
/api/devicesGETListe des dispositifs connectés
/api/scenariosGETScénarios disponibles
/api/scenario/startPOSTDémarrer un scénario
/api/scenario/stopPOSTArrêter la simulation
AppareilMécanisme de découverte
Nodes ESP32Broadcast ESP-NOW ANNOUNCE à intervalles réguliers
SimPilotConnexion mDNS ou WiFi AP dédié
SimCamEnregistrement WebSocket avec type camera
SimServerAgrège toutes les découvertes, maintient le registre centralisé