Na semana passada,
falei sobre como o Yandex.Stations é ativado via som. Descobriu-se que a senha do WiFi é transmitida em texto não criptografado. Eu me perguntava por que era necessário fazer a ativação dessa maneira, e não de alguma maneira depurada.
Como resultado, cheguei à conclusão de que o programa é importante nesse processo. Mas, o que acontecerá se fizermos um protocolo de transferência de dados totalmente focado na experiência do usuário? Foi assim que o projeto Octave nasceu - para transferência de dados melódicos.

Sob o corte, vou lhe dizer como o protótipo foi feito e dar um link para a demonstração. Você pode ouvir como qualquer mensagem soa :)
Resumo do artigo anterior
Gravei o som com o qual a estação é ativada, observei a visualização da transformação de Fourier em movimento e percebi como o sinal é organizado e onde a senha do WiFi fica clara.

Uma cadeia hexadecimal é transmitida, onde para cada caractere 0 - F há uma frequência de 1 kHz - 4,6 kHz com uma etapa de 240 Hz. Eu me perguntava por que era necessário fazer a ativação dessa maneira, e não via Bluetooth, como por exemplo com aspiradores de pó robô chineses, e cheguei à conclusão de que, nesse caso, a eficiência é mais importante que a segurança ou a velocidade.
Inspiração
Realmente! Afinal, o protocolo de comunicação é sempre um compromisso entre faixa, velocidade e confiabilidade. Mas e se todas essas características desaparecerem em segundo plano, e o fator decisivo for o fator de impressão para o usuário?
Gostei da idéia simples, como um martelo, dos desenvolvedores Yandex - de escolher 16 frequências: uma para cada símbolo hexadecimal. E eu também tinha um receptor de sinal de um estudo anterior, então decidi desenvolver essa idéia e não apresentar tudo do zero.
Duas melhorias
Remover quebra de fase
Primeiro, quando analisei o sinal de ativação da estação, fiquei confuso com o ruído em todas as frequências no momento da troca do símbolo. Estas são as barras verticais no espectrograma:

Nesses momentos, cliques são ouvidos. A razão para esse efeito é uma lacuna de fase entre os caracteres. O fato é que o comprimento de um símbolo não se ajusta a um número inteiro de períodos de vibrações sonoras. Portanto, no momento de alternar a frequência, a amplitude do sinal muda drasticamente. Algo assim:

Existem vários métodos no rádio para evitar esse efeito. Decidi reduzir suavemente a amplitude do sinal no momento de alternar a frequência e depois aumentar suavemente - parece mais suave. É assim:

Talvez os cliques não tenham sido um bug, mas apresentem um som mais "futurista", mas eu gosto mais sem eles :)
Adicionar música
Nós transmitimos dados através do som. Por que não usar frequências de notas para isso? Tentei opções diferentes, no final escolhi 16 notas, começando em Antes da primeira oitava.

Usar notas mais altas tornará seus ouvidos menos confortáveis. E notas mais baixas são piores transmitidas devido às características da resposta em frequência de alto-falantes e microfones. Além disso, as frequências das notas baixas estão mais próximas umas das outras, o que afeta a recepção.
Acabou sendo uma espécie de modulação de frequência musical. Vamos chamá-lo de "modulação de garupa" :)
Lançamos
Como isso soa? Para que você possa tentar no navegador, reescrevi o transmissor modulado Krup de python para js e fiz uma interface simples.
Aproveito a oportunidade para dizer olá:
Uso utf-8, o que significa que caracteres cirílicos e até emojis também podem ser transmitidos. As encomendas com eles são mais longas, pois cada caractere possui mais de 1 byte.
Parece um pouco menos agradável que o latim, pois cada caractere cirílico contém o mesmo byte de endereço. Mas ainda é interessante :)
Você pode tentar qualquer frase
aqui . (Duplicar no final do artigo)
Mas e o receptor?
Obviamente, é divertido ouvir sons aleatórios baseados em texto, mas a transmissão de dados só pode ser chamada se o sinal for recebido, desmodulado e decodificado.
Fiz um protótipo de um receptor python como prova de conceito. Veja como funciona:
Você vê, a transferência de dados é como se por notas! Obviamente, não há dúvida de produção no momento. Não há sincronização, codificação de correção de erros e controle de integridade. Mas se a comunidade mostrar interesse e apresentar algumas opções para uso prático, eu posso implementar a funcionalidade acima e envolvê-la em uma biblioteca normal :)
Resumir
Foi um projeto interessante para algumas noites com um resultado bastante espetacular. Essa transferência de dados pode ser usada, por exemplo, como um "código QR sólido" - para compartilhar uma conta de um telefone para um site, etc.
Como alternativa, você pode usá-lo para criar toques para marcas. Aqui, por exemplo,
soa como habr .
Todos os desenvolvimentos atuais estão disponíveis no
github - você pode tentar desenvolver o projeto você mesmo.
Duplique o
link para a demonstração em execução no navegador.Obrigado pela leitura! Espero que você esteja interessado.
Boa sorte