Это проект, на который меня вдохновила уязвимость в «Яндекс.Станции».
Я написал про него на Хабре:
Реверс инжиниринг протокола активации Яндекс.Станции
Как уязвимость в Яндекс.Станции вдохновила меня на проект: Музыкальная передача данных
И на vc.ru:
Уязвимость в «Яндекс.Станции» вдохновила меня сделать сервис для музыкальной передачи данных
В репозитории можно найти файлы на Python в папке research и продолжить эксперименты. Также тут хранятся фалы для web-демки доступной по адресу octave.skrup.ru - при желании можно выбрать другие ноты для передачи данных и, так сказать, поменять жанр. Затем развернуть на своем сервере.
Кратко перескажу статьи здесь.
Друзья подарили мне «Яндекс.Станцию». Для её активации нужно было поднести телефон и проиграть звук из приложения «Яндекс».
Я создал точку доступа Wi-Fi с паролем «012345678» и записал получившийся сигнал. Затем посмотрел на спектрограмму и понял, как устроен сигнал и где лежит пароль от WiFi.
Данные для Станции кодируются символами по 4 бита. По сути кодируется hex строка, где каждому значению 0 — F соответствует своя частота от 1 кГц до 4,6 кГц с шагом в 240 Гц. Пароль не шифруется и передаётся в открытом виде.
Я размышлял, зачем нужно было делать активацию так, а не через Bluetooth, как, например, у китайских пылесосов-роботов, и пришёл к выводу, что в этом случае эффектность важна больше, чем безопасность или скорость.
Действительно! Ведь протокол связи — всегда компромисс между дальностью, скоростью и надёжностью. А что, если все эти характеристики отойдут на второй план, а определяющим станет фактор впечатления для пользователя? Я решил сделать протокол, в котором для модуляции будут использоваться частоты нот.
Мне понравилась простая, как молоток, идея разработчиков «Яндекса» — выбрать 16 частот: по одной для каждого hex-символа. А ещё у меня остались наработки от реверс-инжиниринга, поэтому я решил развить эту идею, а не придумывать всё с нуля.
Глубоко в технику вдаваться не будем: подробнее о разработке я написал в другой статье на «Хабре». А сейчас расскажу в двух словах.
Я избавился от щелчков в сигнале «Яндекс.Станции» и выбрал новые частоты для передачи: 16 нот, начиная с До первой октавы. Вот так:
Если использовать более высокие ноты, то становится менее комфортно ушам. А более низкие ноты хуже передаются из-за особенностей динамиков и микрофонов.
Получилась своего рода музыкально-частотная модуляция. Назовём её «круп-модуляция» :)
Чтобы можно было попробовать прямо в браузере, я переписал передатчик с круп-модуляцией с Python на JavaScript и сделал простенький интерфейс.
Пользуясь случаем, хочу передать привет:
Кириллические символы и даже эмодзи тоже работают. Но посылки с ними получаются длиннее и менее мелодичными из-за особенностей кодировки.
Можете попробовать любые фразы тут
Это, конечно, весело — слушать рандомные звуки на основе текста, но передачей данных можно будет назвать, только если сигнал будет приниматься.
Я сделал прототип приёмника в качестве proof of concept. Вот как он работает:
Видите, передача данных идёт как по нотам! Конечно, ни о каком продакшне сейчас речи не идёт. Тут нет синхронизации, помехоустойчивого кодирования и контроля целостности. Вы можете доработать сами - все исходники тут.
Как думаете, какие варианты практического применения и коммерциализации могут быть у музыкальной передачи данных?
Это был интересный проект на пару вечеров с достаточно эффектным результатом. Такую передачу данных можно использовать, например, как «звуковой QR-code» — расшарить аккаунт с телефона на сайт и прочее.