Screensharing LAN

Intégrer le screen sharing et l’audio bidirectionnel du casque Pulse via WebRTC + WebSocket de signalisation en LAN (port 8888).

1) Connexion réseau

  • WebSocket de signalisation vers le casque : ws://<ip_casque>:8888

  • En local sur le même casque : ws://127.0.0.1:8888

2) Rooms de signalisation (WebSocket)

À l’ouverture du WS, rejoindre les rooms :

{"type":"join","room":"SCREEN_SHARE_ROOM"}
{"type":"join","room":"AUDIO_BIDIRECTIONAL_ROOM"}

Messages échangés (JSON) :

  • offer: {"type":"offer","sdp":"...","room":"...","source":"video|audio","id":"<ip optional>"}

  • answer: {"type":"answer","sdp":"...","room":"...","source":"video|audio"}

  • ice: {"type":"ice","candidate":{...},"sdpMid":"0","sdpMLineIndex":0}

  • stream_stopped (optionnel) : {"type":"stream_stopped","room":"..."}.

3) Flux vidéo (screen share)

  • Client crée une offre SDP recvonly vidéo pour SCREEN_SHARE_ROOM.

  • Casque renvoie une answer et publie un track vidéo (capture écran).

  • Rendu : attach le MediaStream reçu (HTMLVideoElement / RTCView RN / surface native).

  • Sur stream_stopped ou fermeture PC : fermer la PeerConnection et relancer si besoin.

4) Flux audio bidirectionnel

  • Offre SDP sendrecv audio pour AUDIO_BIDIRECTIONAL_ROOM.

  • Answer du casque, puis audio bidirectionnel (micro client ↔ casque).

  • Même gestion ICE/cleanup que la vidéo.

5) Permissions (côté casque)

Canal permission (WS MDM global) : {"type":"SCREEN_SHARE","data":{"accepted":boolean}}

  • Si accepted=false, fermer la PeerConnection/stream pour cet IP.

6) Séquences (texte)

  • Vidéo : WS open → join SCREEN_SHARE_ROOM → client offer (recvonly) → casque answer → ICE LAN → casque push track → éventuel stream_stopped → cleanup.

  • Audio : WS open → join AUDIO_BIDIRECTIONAL_ROOM → client offer (sendrecv) → casque answer → ICE LAN → audio bidirectionnel.

7) Snippets multi-stack (schéma)

Web (JS) pseudo-code :

Android natif (Kotlin) : WebSocket + WebRTC Android, envoyer/recevoir le même JSON, addTransceiver("video", RtpTransceiver.RtpTransceiverDirection.RECV_ONLY).

iOS/macOS (Swift) : WebRTC iOS, même format JSON, addTransceiver(of: .video, direction: .recvOnly).

Backend (node/go/python) : possible en headless si rendu/transcodage géré (FFmpeg/Pion), même signalisation JSON.

8) Réseau LAN

  • Port par défaut côté casque : 8888 (WS de signalisation).

  • Candidats ICE LAN uniquement (pas de TURN).

9) Nettoyage / relance

  • Fermer la PeerConnection sur stream_stopped, fermeture WS ou perte réseau.

  • Relancer l’offre si vous voulez reprendre le flux après un stop.

Mis à jour