
Partage de fichiers local, pair-à-pair, sans serveur, via le son.
Une preuve de concept pour la signalisation WebRTC via le son. Fonctionne avec tous les appareils dotés d'un microphone + haut-parleurs. S'exécute dans le navigateur.
Les appareils à proximité négocient la connexion WebRTC en échangeant les données nécessaires du protocole de description de session (SDP) via une séquence de tonalités audio. Après une négociation réussie, une connexion WebRTC locale est établie entre les navigateurs, permettant l'échange de données via le réseau local.
Voir en action (vidéo de 2 minutes) :
Essayez par vous-même : ggerganov.github.io/wave-share
Dernières nouvelles :
J'ai extrait l'algorithme de transmission de données par le son dans une bibliothèque autonome appelée ggwave.
Elle peut être facilement intégrée dans d'autres projets.
La technologie WebRTC permet à deux navigateurs s'exécutant sur des appareils différents de se connecter l'un à l'autre et d'échanger des données. Il n'est pas nécessaire d'installer des plugins ou de télécharger des applications. Pour initier la connexion, les pairs échangent des informations de contact (adresse IP, ports réseau, identifiant de session, etc.). Ce processus est appelé "signalisation". La spécification WebRTC ne définit aucune norme pour la signalisation - l'échange de contacts peut être réalisé par n'importe quel protocole ou technologie.
Dans ce projet, la signalisation est effectuée via le son. La séquence de signalisation se présente comme suit :

La séquence de signalisation décrite n'implique pas de serveur de signalisation. Par conséquent, une application utilisant la signalisation par le son peut être, par exemple, servie par une page web statique. La seule exigence est de contrôler les périphériques de sortie/capture audio.
Une limitation évidente (fonctionnalité) de l'approche actuelle est que seuls les appareils à proximité (par exemple dans la même pièce) peuvent établir une connexion entre eux. De plus, les appareils doivent être connectés au même réseau local, car le NAT n'est pas disponible.
Les données communiquées par le son contiennent les informations de contact nécessaires pour initialiser la connexion WebRTC. Ces données sont stockées au format Session Description Protocol (SDP). Étant donné que la transmission de données par le son a des limitations importantes en termes de bande passante et de robustesse, il est souhaitable de transmettre le moins de données possible. Par conséquent, le SDP est dépouillé de toutes les informations non pertinentes et seules les données essentielles nécessaires à l'établissement de la connexion sont transmises. Actuellement, le paquet sonore contenant les données SDP minimales requises a le format suivant :
La taille totale du paquet audio est de 112 octets. Avec l'algorithme d'encodage audio actuel, le paquet SDP peut être transmis en 5 à 10 secondes (selon le protocole Tx utilisé). L'utilisation de protocoles plus lents permet une transmission plus fiable dans des environnements bruyants ou si les appareils de communication sont éloignés les uns des autres.
L'approche actuelle utilise un schéma de modulation multi-fréquence Frequency-Shift Keying (FSK). Les données à transmettre sont d'abord divisées en morceaux de 4 bits. À chaque instant, 3 octets sont transmis en utilisant 6 tonalités - une tonalité pour chaque morceau de 4 bits. Les 6 tonalités sont émises dans une plage de 4,5 kHz divisée en 96 fréquences régulièrement espacées :
Pour tous les protocoles : dF = 46.875 Hz. Pour les protocoles non ultrasoniques : F0 = 1875.000 Hz. Pour les protocoles ultrasoniques : F0 = 15000.000 Hz.
Pour plus de commodité, un simple hack WebRTC est utilisé pour détecter automatiquement l'adresse IP locale de votre machine, afin que vous n'ayez pas à la fournir manuellement. Cependant, la dernière spécification WebRTC empêche cela pour des raisons de sécurité, donc à un moment donné, cette « fonctionnalité » cessera de fonctionner dans tous les navigateurs. Par exemple, elle ne fonctionne plus sur Safari.
wave.wasmVous aurez besoin d'un compilateur Emscripten. Exécutez le script compile.sh.
wave-shareImportant : Cet outil CLI était le prototype de la bibliothèque désormais autonome ggwave. Assurez-vous de la consulter, car elle contient des exemples plus récents pour l'application de ce type de communication par données sonores.
Il s'agit d'un outil simple qui reçoit et envoie des données en utilisant le protocole d'émission/réception sonore wave-share expliqué. Saisissez du texte dans l'entrée standard et appuyez sur Entrée pour transmettre.
# build
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# running
./wave-share
Voici une courte vidéo montrant comment utiliser l'outil CLI :
| Taille, [B] | Description |
|---|
| 1 | Type du SDP - Offre ou Réponse |
| 1 | Taille du paquet en octets (sans les octets ECC) |
| 4 | Adresse IP du pair émetteur |
| 2 | Port réseau qui sera utilisé pour la communication |
| 32 | Empreinte SHA-256 des données de session |
| 40 | Identifiants ICE - 16 octets nom d'utilisateur + 24 octets mot de passe |
| 32 | Octets de correction ECC utilisés pour corriger les erreurs lors de la Tx |
| Fréq, [Hz] | Valeur, [bits] | Fréq, [Hz] | Valeur, [bits] | ... | Fréq, [Hz] | Valeur, [bits] |
|---|
F0 + 00*dF | Morceau 0 : 0000 | F0 + 16*dF | Morceau 1 : 0000 | ... | F0 + 80*dF | Morceau 5 : 0000 |
F0 + 01*dF | Morceau 0 : 0001 | F0 + 17*dF | Morceau 1 : 0001 | ... | F0 + 81*dF | Morceau 5 : 0001 |
F0 + 02*dF | Morceau 0 : 0010 | F0 + 18*dF | Morceau 1 : 0010 | ... | F0 + 82*dF | Morceau 5 : 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | Morceau 0 : 1110 | F0 + 30*dF | Morceau 1 : 1110 | ... | F0 + 94*dF | Morceau 5 : 1110 |
F0 + 15*dF | Morceau 0 : 1111 | F0 + 31*dF | Morceau 1 : 1111 | ... | F0 + 95*dF | Morceau 5 : 1111 |