Перейти к содержимому

Превращаем старый роутер в Wi-Fi радиоприемник (часть 2)

Добрый день, читатели! Продолжаем работу над превращением роутера в радиоприемник потокового вещания. В данной статье разберем программную начинку.

В прошлый раз я остановился на том, что роутер был перепрошит на OpenWRT, обновлены и установлены необходимые пакеты и установка связка из аудио сервера и консольного клиента mpd/mpc. В первую очередь займемся настройкой вывода аудио и если все пройдет нормально будем добавлять функциональность.

Подключаемся к роутеру с помощью WinSCP. Делать это можно и через провод и по Wi-Fi, но заменяя IP адрес (адреса IP для каждого соединения обозначены в файле etc/config/network , указания по настройке которого были в прошлой части). Открываем файл etc/init.d/mpd и заменяем имя «владельца» в этих двух строчках с «mpd» на «root»:

USER=»root»
GROUP=»root»

По идее, можно оставить и «mpd», но тогда далее надо будет разбираться с правами и доступами в остальных файлах.

Затем настраиваем конфигурацию mpd в файле etc/mpd.conf . По умолчанию, в этом файле, в комментариях, уже есть вся инструкция по его настройке. В моем случае , его содержательная часть выглядит следующим образом:

playlist_directory «/etc/wifiradio/»
music_directory «/etc/wifiradio/»
db_file «/etc/wifiradio/mpd.db

bind_to_address «any»
port «6600»

input {
plugin «curl»
}

audio_output {
type «alsa»
name «My ALSA Device»
device «hw:0,0» # optional
mixer_type «hardware» # optional
mixer_device «default» # optional
mixer_control «Speaker» # optional
mixer_index «0» # optional
}

Так же необходимо создать папку etc/wifiradio и в ней пустой файл mpd.db . Естественно, что в вашем случае и имя папки и файла может быть другим.

Номер звуковой карты и устройства для соответствующей строки можно узнать запустив терминал PuTTY и введя команду cat /proc/asound/cards или aplay -1 .

После настройки конфигурации mpd перезагружаем роутер, запускаем терминал. Обновляем базу данных и пробуем что то проиграть. Если все сделано правильно, из колонок должна зазвучать трансляция радиостанции:

mpc update

mpc add https://dfm.hostingradio.ru/dfm128.mp3

mpc play

После этого этапа можно переходить непосредственно к настройке управления воспроизведением. В прилагаемом zip-архиве содержатся все необходимые для этого файлы с достаточно подробными комментариями. Изначально, идея того как управлять воспроизведением станций взята на https://wifiradio.su/, так же были утащены некоторые файлы. Остановлюсь на нескольких принципиальных моментах:

Управление радио осуществляется через http, для этого на роутере работает сервер uHTTPd, который обслуживает интерфейс LuCi и управление приемником. Основные файлы находятся в каталогах etc/wifiradio/ , www/cgi-bin/ , www/radio/

chmod +x /usr/bin/имя_файла.sh

Схема работы приемника:

  • После загрузки системы, стартует файл автозапуска etc/rc.local , в котором даются права доступа к каталогам и файлам, запускается файл загрузки управления www/cgi-bin/load.sh и запускается мини-скрипт который не позволяет радиоприемнику и точке доступа терять друг-друга (об этом будет подробнее рассказано ниже)
  • load.sh запускает mpd и mpc, устанавливает устройство воспроизведения и громкость. Затем запускается скрипт playliast_check.sh который берет файл плейлиста, последовательно проверят станции на доступность, что бы исключить станции не ведущие вещание, и формирует файл плейлиста на текущий сеанс. После этого определяется станция, с которой будет начато воспроизведение. В конце запускается очень важный скрипт etc/wifiradio/ping.sh , который фоном висит в системе и периодически проверят «жив» ли mpd и перезапускает его при необходимости.
  • cgi-bin/play.sh — загружает в mpc текущий плейлист и запускает воспроизведение
  • Прочие файлы в www/cgi-bin/ нужны для организации управления плейером через html страницу. Файлы status.sh и get_volume.sh обеспечивают «обратную связь» — передают данные о воспроизводимой станции / композиции и текущей громкости, соответственно.

Немного подробнее о устойчивости работы радиоприемника: По результатам нескольких дней эксплуатации были выявлены пара проблем — иногда бывал недоступен только web-интерфейс управления, иногда был недоступен приемник в целом (ни http сервер, ни подключение по ssh), хотя в обоих случаях воспроизведение шло. Предполагаю что одна из причина этого была в падении uHTTPd, вторая в потере ARP-связности, засыпании WI-FI модуля или сбросе сетевого моста. Потоку хватало уже открытого сокета, а новые соединения зависали.

для исправления этого были предприняты следующие действия:

  • настройка выделенного IP для радиоприемника в точке доступа.
  • настройка канала (36 в моем случае) и его ширины в 20Мгц
  • проверка настроек на наличие каких либо «энергосберегателей», «засыпаний» и прочего
  • добавление мини-скрипта в rc.local , который каждые 30 секунд отправляет пинг на главный роутер, удерживая Wi-Fi сессию и ARP-таблицу в активном состоянии.
  • в папку /bin/ был добавлен скрипт , который мониторит работу http и ssh (80 и 22 порты соответственно) и запускается через планировщик cron каждые 5 минут.
bin/check_services.sh

#!/bin/sh

if ! nc -z 127.0.0.1 80; then
echo «$(date): Web interface (uhttpd) is down! Restarting…» >> /tmp/services_watchdog.log
/etc/init.d/uhttpd restart
fi

if ! nc -z 127.0.0.1 22; then
echo «$(date): SSH (dropbear) is down! Restarting…» >> /tmp/services_watchdog.log
/etc/init.d/dropbear restart
fi

sleep 30
if ! nc -z 127.0.0.1 80 && ! nc -z 127.0.0.1 22; then
echo «$(date): Critical failure! Rebooting router…» >> /tmp/services_watchdog.log
sync
/sbin/reboot
fi

После проведения всех этих манипуляций, если запустить в браузере 192.168.1.168/radio (естественно, IP приемника тут должен быть ваш) появится следующие интерфейс управления:

в следующей части обратимся к «железной» части приемника, попробуем организовать управление при помощи встроенных кнопок.

Ссылка на архив с файлами для управления радиоприемником

Задать вопросы, обсудить данную тему можно на моей странице в ВК https://vk.ru/wall4354390_738