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>:8888En 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
recvonlyvidéo pourSCREEN_SHARE_ROOM.Casque renvoie une
answeret publie un track vidéo (capture écran).Rendu : attach le
MediaStreamreçu (HTMLVideoElement / RTCView RN / surface native).Sur
stream_stoppedou fermeture PC : fermer la PeerConnection et relancer si besoin.
4) Flux audio bidirectionnel
Offre SDP
sendrecvaudio pourAUDIO_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 → éventuelstream_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.
Endpoints/signaling LAN en early alpha : schéma et payloads susceptibles d’évoluer. Vérifiez régulièrement la doc.
Mis à jour