
Sem servidor, ponto a ponto, compartilhamento de arquivos local através de som.
Uma prova de conceito para sinalização WebRTC usando som. Funciona com todos os dispositivos que possuem microfone + alto-falantes. Roda no navegador.
Dispositivos próximos negociam a conexão WebRTC trocando os dados necessários do Session Description Protocol (SDP) por meio de uma sequência de tons de áudio. Após a negociação bem-sucedida, uma conexão WebRTC local é estabelecida entre os navegadores, permitindo a troca de dados via LAN.
Veja em ação (vídeo de 2 minutos):
Experimente você mesmo: ggerganov.github.io/wave-share
Novidades:
Extraí o algoritmo de dados sobre som em uma biblioteca independente chamada ggwave.
Ela pode ser incorporada facilmente em outros projetos.
A tecnologia WebRTC permite que dois navegadores rodando em dispositivos diferentes se conectem e troquem dados. Não é necessário instalar plugins ou baixar aplicativos. Para iniciar a conexão, os pares trocam informações de contato (endereço IP, portas de rede, ID de sessão, etc.). Esse processo é chamado de "sinalização". A especificação WebRTC não define um padrão para sinalização – a troca de contatos pode ser feita por qualquer protocolo ou tecnologia.
Neste projeto, a sinalização é realizada via som. A sequência de sinalização é a seguinte:

A sequência de sinalização descrita não envolve um servidor de sinalização. Portanto, uma aplicação que usa sinalização através de som pode, por exemplo, ser servida por uma página web estática. O único requisito é ter controle sobre os dispositivos de saída/captura de áudio.
Uma limitação (característica) óbvia da abordagem atual é que apenas dispositivos próximos (por exemplo, na mesma sala) podem estabelecer conexão entre si. Além disso, os dispositivos precisam estar conectados na mesma rede local, pois o NAT não está disponível.
Os dados comunicados através do som contêm as informações de contato necessárias para inicializar a conexão WebRTC. Esses dados são armazenados no formato Session Description Protocol (SDP). Como a transmissão de dados sobre som tem limitações significativas em termos de largura de banda e robustez, é desejável transmitir o mínimo possível de dados. Portanto, o SDP é limpo de todas as informações irrelevantes e apenas os dados essenciais para estabelecer a conexão são transmitidos. Atualmente, o pacote de som contendo os dados mínimos do SDP tem o seguinte formato:
O tamanho total do pacote de áudio é 112 bytes. Com o algoritmo de codificação de áudio atual, o pacote SDP pode ser transmitido em 5 a 10 segundos (dependendo do protocolo de Tx utilizado). O uso de protocolos mais lentos proporciona uma transmissão mais confiável em ambientes ruidosos ou se os dispositivos comunicantes estiverem distantes um do outro.
A abordagem atual utiliza um esquema de modulação Frequency-Shift Keying (FSK) multifrequencial. Os dados a serem transmitidos são primeiro divididos em blocos de 4 bits. Em cada momento, 3 bytes são transmitidos usando 6 tons – um tom para cada bloco de 4 bits. Os 6 tons são emitidos em uma faixa de 4,5 kHz dividida em 96 frequências igualmente espaçadas:
Para todos os protocolos: dF = 46,875 Hz. Para protocolos não ultrassônicos: F0 = 1875,000 Hz. Para protocolos ultrassônicos: F0 = 15000,000 Hz.
Por conveniência, um simples hack WebRTC é usado para detectar automaticamente o endereço IP local da sua máquina, para que você não precise fornecê-lo manualmente. No entanto, a especificação WebRTC mais recente impede que isso seja possível por razões de segurança, então em algum momento esse "recurso" deixará de funcionar em todos os navegadores. Por exemplo, não funciona mais no Safari.
wave.wasmVocê precisará de um compilador Emscripten. Execute o script compile.sh.
wave-shareImportante: Esta ferramenta CLI foi o protótipo para a agora biblioteca independente ggwave. Certifique-se de conferi-la, pois possui exemplos mais atualizados para a aplicação deste tipo de comunicação de dados sobre som.
Esta é uma ferramenta simples que recebe e envia dados usando o protocolo tx/rx de som wave-share explicado. Digite algum texto na entrada padrão e pressione Enter para transmitir.
# compilação
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# execução
./wave-share
Aqui está um pequeno vídeo demonstrando como usar a ferramenta CLI:
| Tamanho, [B] | Descrição |
|---|
| 1 | Tipo do SDP – Oferta ou Resposta |
| 1 | Tamanho do pacote em bytes (não incluindo bytes de ECC) |
| 4 | Endereço IP do par transmissor |
| 2 | Porta de rede que será usada para a comunicação |
| 32 | Impressão digital SHA-256 dos dados da sessão |
| 40 | Credenciais ICE – 16 bytes de nome de usuário + 24 bytes de senha |
| 32 | Bytes de correção ECC usados para corrigir erros durante a Tx |
| Freq, [Hz] | Valor, [bits] | Freq, [Hz] | Valor, [bits] | ... | Freq, [Hz] | Valor, [bits] |
|---|
F0 + 00*dF | Bloco 0: 0000 | F0 + 16*dF | Bloco 1: 0000 | ... | F0 + 80*dF | Bloco 5: 0000 |
F0 + 01*dF | Bloco 0: 0001 | F0 + 17*dF | Bloco 1: 0001 | ... | F0 + 81*dF | Bloco 5: 0001 |
F0 + 02*dF | Bloco 0: 0010 | F0 + 18*dF | Bloco 1: 0010 | ... | F0 + 82*dF | Bloco 5: 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | Bloco 0: 1110 | F0 + 30*dF | Bloco 1: 1110 | ... | F0 + 94*dF | Bloco 5: 1110 |
F0 + 15*dF | Bloco 0: 1111 | F0 + 31*dF | Bloco 1: 1111 | ... | F0 + 95*dF | Bloco 5: 1111 |