
Sin servidor, peer-to-peer, compartición local de archivos a través del sonido
Una prueba de concepto para la señalización WebRTC mediante sonido. Funciona con todos los dispositivos que tengan micrófono + altavoces. Se ejecuta en el navegador.
Los dispositivos cercanos negocian la conexión WebRTC intercambiando los datos necesarios del Protocolo de Descripción de Sesión (SDP) a través de una secuencia de tonos de audio. Tras una negociación exitosa, se establece una conexión WebRTC local entre los navegadores, permitiendo el intercambio de datos a través de la LAN.
Míralo en acción (video de 2 minutos):
CG++ Datos a través del sonido
Pruébalo tú mismo: ggerganov.github.io/wave-share
Últimas noticias:
He extraído el algoritmo de datos a través del sonido en una biblioteca independiente llamada ggwave.
Se puede integrar fácilmente en otros proyectos.
La tecnología WebRTC permite que dos navegadores que se ejecutan en diferentes dispositivos se conecten entre sí e intercambien datos. No es necesario instalar complementos ni descargar aplicaciones. Para iniciar la conexión, los pares intercambian información de contacto (dirección IP, puertos de red, ID de sesión, etc.). Este proceso se denomina "señalización". La especificación WebRTC no define ningún estándar para la señalización: el intercambio de contactos se puede lograr mediante cualquier protocolo o tecnología.
En este proyecto, la señalización se realiza a través del sonido. La secuencia de señalización es la siguiente:

La secuencia de señalización descrita no involucra un servidor de señalización. Por lo tanto, una aplicación que utilice señalización a través del sonido puede ser servida, por ejemplo, por una página web estática. El único requisito es tener control sobre los dispositivos de salida/captura de audio.
Una limitación obvia (característica) del enfoque actual es que solo los dispositivos cercanos (por ejemplo, en la misma habitación) pueden establecer conexión entre sí. Además, los dispositivos deben estar conectados en la misma red local, ya que NAT no está disponible.
Los datos comunicados a través del sonido contienen la información de contacto necesaria para inicializar la conexión WebRTC. Estos datos se almacenan en el formato Protocolo de Descripción de Sesión (SDP). Dado que la transmisión de datos a través del sonido tiene limitaciones significativas en términos de ancho de banda y robustez, es deseable transmitir la menor cantidad de datos posible. Por lo tanto, el SDP se despoja de toda información irrelevante y solo se transmiten los datos esenciales necesarios para establecer la conexión. Actualmente, el paquete de sonido que contiene los datos SDP mínimos requeridos tiene el siguiente formato:
El tamaño total del paquete de audio es de 112 bytes. Con el algoritmo actual de codificación de audio, el paquete SDP se puede transmitir en 5-10 segundos (dependiendo del protocolo Tx utilizado). El uso de protocolos más lentos proporciona una transmisión más confiable en entornos ruidosos o si los dispositivos de comunicación están lejos entre sí.
El enfoque actual utiliza un esquema de modulación multifrecuencia de Modulación por desplazamiento de frecuencia (FSK). Los datos a transmitir se dividen primero en fragmentos de 4 bits. En cada momento, se transmiten 3 bytes utilizando 6 tonos, un tono para cada fragmento de 4 bits. Los 6 tonos se emiten en un rango de 4.5 kHz dividido en 96 frecuencias igualmente espaciadas:
Para todos los protocolos: dF = 46.875 Hz. Para protocolos no ultrasónicos: F0 = 1875.000 Hz. Para protocolos ultrasónicos: F0 = 15000.000 Hz.
Por conveniencia, se utiliza un simple truco de WebRTC para detectar automáticamente la dirección IP local de tu máquina, para que no tengas que proporcionarla manualmente. Sin embargo, la última especificación de WebRTC impide esto por razones de seguridad, por lo que en algún momento esta "característica" dejará de funcionar en todos los navegadores. Por ejemplo, ya no funciona en Safari.
wave.wasmNecesitarás un compilador Emscripten. Ejecuta el script compile.sh.
wave-shareImportante: Esta herramienta CLI fue el prototipo de la ahora biblioteca independiente ggwave. Asegúrate de echarle un vistazo, ya que tiene ejemplos más actualizados para la aplicación de este tipo de comunicación de datos a través del sonido.
Esta es una herramienta simple que recibe y envía datos utilizando el protocolo tx/rx de sonido wave-share explicado. Escribe algún texto en la entrada estándar y presiona Enter para transmitir.
# build
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# running
./wave-share
Aquí hay un video corto que demuestra cómo usar la herramienta CLI:
| Tamaño, [B] | Descripción |
|---|
| 1 | Tipo del SDP - Oferta o Respuesta |
| 1 | Tamaño del paquete en bytes (sin incluir bytes ECC) |
| 4 | Dirección IP del par transmisor |
| 2 | Puerto de red que se utilizará para la comunicación |
| 32 | Huella digital SHA-256 de los datos de la sesión |
| 40 | Credenciales ICE - 16 bytes de nombre de usuario + 24 bytes de contraseña |
| 32 | Bytes de corrección ECC utilizados para corregir errores durante la Tx |
| Frec, [Hz] | Valor, [bits] | Frec, [Hz] | Valor, [bits] | ... | Frec, [Hz] | Valor, [bits] |
|---|
F0 + 00*dF | Fragmento 0: 0000 | F0 + 16*dF | Fragmento 1: 0000 | ... | F0 + 80*dF | Fragmento 5: 0000 |
F0 + 01*dF | Fragmento 0: 0001 | F0 + 17*dF | Fragmento 1: 0001 | ... | F0 + 81*dF | Fragmento 5: 0001 |
F0 + 02*dF | Fragmento 0: 0010 | F0 + 18*dF | Fragmento 1: 0010 | ... | F0 + 82*dF | Fragmento 5: 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | Fragmento 0: 1110 | F0 + 30*dF | Fragmento 1: 1110 | ... | F0 + 94*dF | Fragmento 5: 1110 |
F0 + 15*dF | Fragmento 0: 1111 | F0 + 31*dF | Fragmento 1: 1111 | ... | F0 + 95*dF | Fragmento 5: 1111 |