
Serverlos, Peer-to-Peer, lokales Dateiteilen durch Ton
Ein Proof-of-Concept für WebRTC-Signalisierung mittels Ton. Funktioniert mit allen Geräten, die Mikrofon + Lautsprecher haben. Läuft im Browser.
Nahegelegene Geräte handeln die WebRTC-Verbindung aus, indem sie die notwendigen Session Description Protocol (SDP)-Daten über eine Folge von Tönen austauschen. Nach erfolgreicher Aushandlung wird eine lokale WebRTC-Verbindung zwischen den Browsern hergestellt, die den Datenaustausch über LAN ermöglicht.
Sehen Sie es in Aktion (2-Minuten-Video):
Probieren Sie es selbst aus: ggerganov.github.io/wave-share
Aktuelles:
Ich habe den Data-over-Sound-Algorithmus in eine eigenständige Bibliothek namens ggwave extrahiert.
Sie kann problemlos in andere Projekte eingebettet werden.
Die WebRTC-Technologie ermöglicht es zwei Browsern auf verschiedenen Geräten, sich miteinander zu verbinden und Daten auszutauschen. Es ist nicht erforderlich, Plugins zu installieren oder Anwendungen herunterzuladen. Um die Verbindung zu initiieren, tauschen die Peers Kontaktinformationen aus (IP-Adresse, Netzwerkports, Sitzungs-ID usw.). Dieser Prozess wird als "Signalisierung" bezeichnet. Die WebRTC-Spezifikation definiert keinen Standard für die Signalisierung – der Kontaktaustausch kann über jedes Protokoll oder jede Technologie erfolgen.
In diesem Projekt erfolgt die Signalisierung über Ton. Der Signalisierungsablauf sieht wie folgt aus:

Die beschriebene Signalisierungssequenz beinhaltet keinen Signalisierungsserver. Daher kann eine Anwendung, die Signalisierung über Ton verwendet, beispielsweise von einer statischen Webseite bereitgestellt werden. Die einzige Voraussetzung ist die Kontrolle über die Audio-Ausgabe-/Aufnahmegeräte.
Eine offensichtliche Einschränkung (Funktion) des aktuellen Ansatzes ist, dass nur nahegelegene Geräte (z.B. im selben Raum) eine Verbindung miteinander herstellen können. Darüber hinaus müssen die Geräte im selben lokalen Netzwerk verbunden sein, da NAT nicht verfügbar ist.
Die über Ton übertragenen Daten enthalten die Kontaktinformationen, die zur Initialisierung der WebRTC-Verbindung erforderlich sind. Diese Daten werden im Session Description Protocol (SDP)-Format gespeichert. Da Data-over-Sound erhebliche Einschränkungen in Bezug auf Bandbreite und Robustheit aufweist, ist es wünschenswert, so wenig Daten wie möglich zu übertragen. Daher wird das SDP von allen irrelevanten Informationen befreit und nur die wesentlichen Daten, die zum Aufbau der Verbindung benötigt werden, übertragen. Derzeit hat das Tonpaket, das die minimal erforderlichen SDP-Daten enthält, das folgende Format:
Die Gesamtgröße des Audiopakets beträgt 112 Bytes. Mit dem aktuellen Audio-Codierungsalgorithmus kann das SDP-Paket in 5-10 Sekunden übertragen werden (abhängig vom verwendeten Sende-Protokoll). Die Verwendung langsamerer Protokolle bietet eine zuverlässigere Übertragung in lauten Umgebungen oder wenn die kommunizierenden Geräte weit voneinander entfernt sind.
Der aktuelle Ansatz verwendet ein mehrfrequentes Frequency-Shift-Keying (FSK)-Modulationsschema. Die zu übertragenden Daten werden zunächst in 4-Bit-Blöcke aufgeteilt. Zu jedem Zeitpunkt werden 3 Bytes mit 6 Tönen übertragen – ein Ton für jeden 4-Bit-Block. Die 6 Töne werden in einem 4,5-kHz-Bereich emittiert, der in 96 gleichmäßig verteilte Frequenzen unterteilt ist:
Für alle Protokolle: dF = 46.875 Hz. Für nicht-ultraschall Protokolle: F0 = 1875.000 Hz. Für Ultraschallprotokolle: F0 = 15000.000 Hz.
Der Einfachheit halber wird ein einfacher WebRTC-Hack verwendet, um automatisch die lokale IP-Adresse Ihres Computers zu erkennen, sodass Sie sie nicht manuell angeben müssen. Allerdings verhindert die neueste WebRTC-Spezifikation dies aus Sicherheitsgründen, sodass dieses "Feature" irgendwann in allen Browsern nicht mehr funktionieren wird. Beispielsweise funktioniert es auf Safari nicht mehr.
wave.wasmSie benötigen einen Emscripten-Compiler. Führen Sie das Skript compile.sh aus.
wave-shareWichtig: Dieses CLI-Tool war der Prototyp für die inzwischen eigenständige Bibliothek ggwave. Schauen Sie sich diese unbedingt an, da sie aktuellere Beispiele für die Anwendung dieser Art der Daten-über-Ton-Kommunikation enthält.
Dies ist ein einfaches Tool, das Daten mit dem erklärten wave-share-Ton-Sende-/Empfangsprotokoll empfängt und sendet. Geben Sie etwas Text in die Standardeingabe ein und drücken Sie die Eingabetaste, um zu senden.
# build
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# running
./wave-share
Hier ist ein kurzes Video, das die Verwendung des CLI-Tools zeigt:
| Größe, [B] | Beschreibung |
|---|
| 1 | Typ des SDP – Angebot oder Antwort |
| 1 | Paketgröße in Bytes (ohne ECC-Bytes) |
| 4 | IP-Adresse des sendenden Peers |
| 2 | Netzwerkport, der für die Kommunikation verwendet wird |
| 32 | SHA-256-Fingerabdruck der Sitzungsdaten |
| 40 | ICE-Anmeldedaten – 16 Bytes Benutzername + 24 Bytes Passwort |
| 32 | ECC-Korrekturbytes zur Fehlerkorrektur während des Sendens |
| Freq, [Hz] | Wert, [Bits] | Freq, [Hz] | Wert, [Bits] | ... | Freq, [Hz] | Wert, [Bits] |
|---|
F0 + 00*dF | Block 0: 0000 | F0 + 16*dF | Block 1: 0000 | ... | F0 + 80*dF | Block 5: 0000 |
F0 + 01*dF | Block 0: 0001 | F0 + 17*dF | Block 1: 0001 | ... | F0 + 81*dF | Block 5: 0001 |
F0 + 02*dF | Block 0: 0010 | F0 + 18*dF | Block 1: 0010 | ... | F0 + 82*dF | Block 5: 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | Block 0: 1110 | F0 + 30*dF | Block 1: 1110 | ... | F0 + 94*dF | Block 5: 1110 |
F0 + 15*dF | Block 0: 1111 | F0 + 31*dF | Block 1: 1111 | ... | F0 + 95*dF | Block 5: 1111 |