
Condivisione di file locale peer-to-peer senza server tramite suono
Una prova di concetto per la segnalazione WebRTC tramite suono. Funziona con tutti i dispositivi che hanno microfono + altoparlanti. Viene eseguito nel browser.
I dispositivi vicini negoziano la connessione WebRTC scambiando i dati necessari del Session Description Protocol (SDP) tramite una sequenza di toni audio. Dopo una negoziazione riuscita, viene stabilita una connessione WebRTC locale tra i browser, permettendo lo scambio di dati tramite LAN.
Vedilo in azione (video di 2 minuti):
Provalo tu stesso: ggerganov.github.io/wave-share
Ultime notizie:
Ho estratto l'algoritmo dati-su-suono in una libreria standalone chiamata ggwave.
Può essere facilmente integrata in altri progetti.
La tecnologia WebRTC consente a due browser in esecuzione su dispositivi diversi di connettersi tra loro e scambiare dati. Non è necessario installare plugin o scaricare applicazioni. Per avviare la connessione, i peer si scambiano informazioni di contatto (indirizzo IP, porte di rete, ID di sessione, ecc.). Questo processo è chiamato "signaling". La specifica WebRTC non definisce alcuno standard per il signaling - lo scambio di contatti può essere realizzato con qualsiasi protocollo o tecnologia.
In questo progetto il signaling viene eseguito tramite suono. La sequenza di signaling è la seguente:

La sequenza di signaling descritta non coinvolge un server di signaling. Pertanto, un'applicazione che utilizza il signaling tramite suono può essere servita, ad esempio, da una pagina web statica. L'unico requisito è avere il controllo sui dispositivi di uscita/cattura audio.
Un'ovvia limitazione (caratteristica) dell'approccio attuale è che solo i dispositivi vicini (ad esempio nella stessa stanza) possono stabilire una connessione tra loro. Inoltre, i dispositivi devono essere connessi nella stessa rete locale, poiché NAT non è disponibile.
I dati comunicati tramite suono contengono le informazioni di contatto necessarie per inizializzare la connessione WebRTC. Questi dati sono memorizzati nel formato Session Description Protocol (SDP). Poiché i dati-su-suono hanno limitazioni significative in termini di larghezza di banda e robustezza, è desiderabile trasmettere il minor numero possibile di dati. Pertanto, l'SDP viene privato di tutte le informazioni irrilevanti e vengono trasmessi solo i dati essenziali necessari per stabilire la connessione. Attualmente, il pacchetto audio contenente i dati SDP minimi richiesti ha il seguente formato:
La dimensione totale del pacchetto audio è di 112 byte. Con l'attuale algoritmo di codifica audio, il pacchetto SDP può essere trasmesso in 5-10 secondi (a seconda del protocollo Tx utilizzato). L'uso di protocolli più lenti offre una trasmissione più affidabile in ambienti rumorosi o se i dispositivi comunicanti sono lontani tra loro.
L'approccio attuale utilizza uno schema di modulazione a Frequency-Shift Keying (FSK) multifrequenza. I dati da trasmettere vengono prima suddivisi in blocchi di 4 bit. In ogni momento, vengono trasmessi 3 byte utilizzando 6 toni - un tono per ogni blocco di 4 bit. I 6 toni vengono emessi in un intervallo di 4,5 kHz suddiviso in 96 frequenze equispaziate:
Per tutti i protocolli: dF = 46.875 Hz. Per i protocolli non ultrasonici: F0 = 1875.000 Hz. Per i protocolli ultrasonici: F0 = 15000.000 Hz.
Per comodità, viene utilizzato un semplice hack WebRTC per rilevare automaticamente l'indirizzo IP locale della tua macchina, così non devi fornirlo manualmente. Tuttavia, l'ultima specifica WebRTC impedisce ciò per motivi di sicurezza, quindi a un certo punto questa "funzionalità" smetterà di funzionare in tutti i browser. Ad esempio, non funziona più su Safari.
wave.wasmAvrai bisogno di un compilatore Emscripten. Esegui lo script compile.sh.
wave-shareImportante: Questo strumento CLI è stato il prototipo per l'ora libreria standalone ggwave. Assicurati di darle un'occhiata, poiché contiene esempi più aggiornati per l'applicazione di questo tipo di comunicazione dati-su-suono.
Questo è un semplice strumento che riceve e invia dati utilizzando il protocollo suono tx/rx wave-share spiegato. Digita del testo sull'input standard e premi Invio per trasmettere.
# build
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# running
./wave-share
Ecco un breve video che dimostra come usare lo strumento CLI:
| Dimensione, [B] | Descrizione |
|---|
| 1 | Tipo di SDP - Offerta o Risposta |
| 1 | Dimensione del pacchetto in byte (esclusi i byte ECC) |
| 4 | Indirizzo IP del peer trasmittente |
| 2 | Porta di rete che verrà utilizzata per la comunicazione |
| 32 | Impronta digitale SHA-256 dei dati di sessione |
| 40 | Credenziali ICE - 16 byte username + 24 byte password |
| 32 | Byte di correzione ECC utilizzati per correggere errori durante la Tx |
| Freq, [Hz] | Valore, [bit] | Freq, [Hz] | Valore, [bit] | ... | Freq, [Hz] | Valore, [bit] |
|---|
F0 + 00*dF | Chunk 0: 0000 | F0 + 16*dF | Chunk 1: 0000 | ... | F0 + 80*dF | Chunk 5: 0000 |
F0 + 01*dF | Chunk 0: 0001 | F0 + 17*dF | Chunk 1: 0001 | ... | F0 + 81*dF | Chunk 5: 0001 |
F0 + 02*dF | Chunk 0: 0010 | F0 + 18*dF | Chunk 1: 0010 | ... | F0 + 82*dF | Chunk 5: 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | Chunk 0: 1110 | F0 + 30*dF | Chunk 1: 1110 | ... | F0 + 94*dF | Chunk 5: 1110 |
F0 + 15*dF | Chunk 0: 1111 | F0 + 31*dF | Chunk 1: 1111 | ... | F0 + 95*dF | Chunk 5: 1111 |