Огляд і програмування під стаціонарне інтернет радіо

Кілька років назад я вже викладав статті про те як з роутера зробити мережеву звукову карту. Той варіант вимагав наявності активного джерела звуку і колонок. Переносний варіант виглядав би занадто громіздким, тому було вирішено придбати готовий продукт. Через доступність і як найдешевше з можливих варіантів (50 євро) я вибрав renkforce IR 1.
image
З ключових характеристик мені були важливі наступні:

image
DLNA
Наявність DLNA дозволяє безпосередньо передати звук з Linux на інтернет радіо. Зробити це можна як мінімум трьома способами:
  • Пасивний. Записувати все, що відтворюється звуковий картою в файл і відтворювати цей файл на радіо через minidlna сервер.
  • Активний. Rygel, який створює віртуальну звукову карту і транслює весь звук з неї через DLNA. Запускається скриптами, вимагає конфігураційних файлів.
  • Активний, простий. Використовувати проект https://github.com/masmu/pulseaudio-dlna. Можна встановити вручну, через ppa репозиторій в Ubuntu або бэкпортировать пакет з Ubuntu 16.10.
Детальніше про ці способи можна почитати здесь.
Також можна програвати музику прямо з Android телефону. Підтримка DLNA була знайдена тільки у представленому на телефоні музичному плеєрі від Samsung. Я намагався знайти музичні програвачі з підтримкою DLNA в Google Play, але безуспішно.
WiFi
Єдиним незначним мінусом є відсутність підтримки протоколу 802.11 n.
Звук
Звук для даної категорії пристрою цілком пристойний (одна колонка на 10W). Я не аудіофіл, але різниця з вбудованими в звичайний ноутбук колонками значна. Баси присутні, джаз звучить чудово, рок та електронна музика теж. Є варіант з двома колонками (модель renkforce IR 2), але я його не розглядав за непотрібністю.
Екран
Екран звичайний. Інтерфейс цілком дружній...
image
Однак процедура додавання своїх станцій залишає бажати кращого.
Плейлист
З-за плейлиста я і вирішив написати цю статтю. Вручну вбивати URL радіостанції, використовуючи пульт або колесо прокрутки ще заняття. Порядок появи символів при використанні цифрових кнопок на ПУЛЬТІ сильно відрізняється від такого, яким звикли при наборі SMS на кнопковому телефоні (для 2 це послідовність "2 A B C a b c" і т. д.). Якщо використовувати колесо прокручування, то доводиться прокручувати кожен символ алфавіту. Я вирішив проаналізувати, чи є можливість додавати плейлист через web інтерфейс.
Web інтерфейс виявився урізаним. Відкритий 80-й порт з заголовком AirMusic показує тільки підписи до налаштувань. HTML посилається на неіснуючі CSS стилі на 8080 порту. Сам 8080 порт за замовчуванням відображає 404 Not Found.
На щастя виявився доступний telnet порт. Використовуючи логін root пароль password мені вдалося отримати доступ до вбудованому busybox. Вивчення внутрішнього устрою дало наступну інформацію:
  • Працює все це добро на процесорі з архітектурою ARM.
  • httpd сервер прослуховує порт 8080 і хостить статику, розташовану /UIData. CSS стилів там не виявилося, так само як і іншої корисної інформації.
  • UIProto — серце радіо. Статично скомпільований додаток, яке слухає 80-й порт, запускає mplayer, відображає інформацію на екрані і багато іншого. За кількістю згадок імені цього бінарника в інтернеті склалося враження, що він розроблений аутсорс компанією (mediayou.net) для більшості китайських інтернет радіо.
UIProto зберігає favorites плейлист в двійковому форматі у файлі /flash/myradio.cfg. Прочитати його через висновок терміналу можливо, але тільки як текст. Щоб отримати файл повністю довелося трохи попотіти. На щастя busybox на радіо скомпільовано з підтримкою команд ftpput і ftpget. Їх я і використав, щоб скопіювати файл на комп'ютер для подальшого вивчення, попередньо налаштувавши FTP сервер.
Аналізував бінарний файл утилітою xxd(1). Приблизно структура файлу виглядає так:
Amount of entries: 2b
Every entry len: 366b
0x00: 1b
0x00|0x02|0x03: 1b
0x20 (32): 1b
0x00: 6b
0x07|0x05: 1b
len(0xTITLE+1): 1b
0x80: 1b
0xTITLE: 40b
0x00: 59b
0xURL: 250b
0x00: 5b
0x00: 2b

Не виключаю, що деякі елементи в структурі, є звичайним сміттям з необнуленной виділеної пам'яті. Використання нулів в цих елементах ніяк не позначається на кінцевому результаті.
Початковий варіант утиліти на C зберігав захардкоженный плейлист. Для зберігання структури в пам'яті утиліти я використовував односвязные списки. Результат першого запуску дав тестовий бінарний плейлист, який я завантажив на пристрій. Навіть при наявності нулів у невідомих мені елементах структури, новий плейлист успішно прочитался. Остаточний варіант утиліти читає плейлист з CSV файлу і записує його в бінарний формат. Приємним бонусом виявилося використання заголовків для радіостанцій замість їх URL (раніше радіостанції у списку відображалися як http://1.2.3.4:8080/radio.mp3).
На закінчення, заради експерименту, я спробував зібрати статичний нативний бінарники, який зміг би запускатися прямо на самому радіо. Практичної користі від цього немає, але можна спробувати написати httpd демон, який дозволить редагувати радіостанції прямо через web інтерфейс. Більш глобальна і малоосуществимая ідея — написати повністю opensource прошивку для інтернет радіо.
Як змусити UIProto перечитвать плейлист після поновлення я так і не зрозумів. Використовую hardcore спосіб — sync і перезавантаження.
Для зручності завантаження плейлиста на радіо я написав скрипти, використовують expect(1).
USB
На платі є нераспаянный USB. Судячи з dmesg(1), він цілком працездатний. Перевірити його працездатність на практиці ще не встиг.
image
Посилання
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.