Wi-Fi интернет-радиоприёмник из роутера с возможностью переключения станций

Нам понадобится:

  • Любой роутер с usb портом, на котрый можно установить OpenWRT — ОС Linux ориентированная на встраиваемые системы. Узнать можно ли на Ваш роутер установить OpenWRT можно на странице https://openwrt.org/toh/start.
  • USB Звуковая карта стоимостью $1-$2.
  • Любые пассивные (или активные) звуковые колонки.
  • Два патч-корда — витая пара обжатая разъёмами 8P8C (в народе RJ-45).
  • Персональный компьютер.
  • Выход в сеть Интернет по технологии Ethernet и Wi-Fi (опционально).


Подключаем роутер к сети Интернет

Подключаем роутер, который будет Wi-Fi интернет-радиоприёмником, к роутеру домашней сети патч-кордом. Один конец патч-корда подключаем к гнезду роутера, который будет Wi-Fi интернет-радиоприёмником, с пометкой Internet, другой конец патч-корда подключаем к любому свободному гнезду LAN роутера домашней сети. Имейте ввиду, что часто, последнее (правое гнездо), если смотреть на роутер со стороны на которой расположены гнёзда, зарезервировано провайдером Интернета под IPTV и для такого подключения не предусмотрен выход в сеть Интернет.

Теперь подключаем наш персональный компьютер к роутеру, который будет Wi-Fi интернет-радиоприёмником, вторым патч-кордом, вставив его разъём в свободное гнездо LAN роутера, который будет Wi-Fi интернет-радиоприёмником.


Перепрошиваем роутер

Нам нужно убедиться, что для нашего роутера есть версия прошивки OpenWRT, это можно сделать здесь: https://openwrt.org/toh/start. У меня есть старый роутер TP-LINK TL-WR842N, для него есть прошивка OpenWRT.

Перепрошиваем роутер следуя инструкции на странице прошивки роутера или общей инструкции: https://openwrt.org/ru/docs/guide-user/installation/generic.flashing.

Настройка OpenWRT

1) Подключаемся к роутеру по ssh, для этого в консоли наберите: (пользователи ОС Windows могут воспользоваться коммандой ssh или putty)

ssh root@192.168.1.1

и первым делом обновляем информацию о пакетах в ОС Linux:

opkg update

Если команда выполняется с ошибками, то Вам необходимо прописать DNS. Это можно сделать в web-интерфейсе OpenWRT. К web-интерфейсу OpenWRT можно подключиться зайдя в браузере на страницу:

⠀https://192.168.1.1
⠀http://192.168.1.1, в случае старой версии OpenWRT

Браузер может предупредить нас о самоподписанном сертификате, проигнорируем это, нажав на кнопку Anvanced и согласившись перейти на страницу входа в web-интерфейс OpenWRT. Авторизуемся без пароля.
Для того, чтобы прописать DNS, в разделе верхнего меню:

Network → DHCP and DNS, на этой странице необходимо удалить записи DNS forwardings и добавить адреса DNS серверов, например адреса DNS серверов Google и OpenDNS: 8.8.8.8, 208.67.222.222, 208.67.220.220, как показано на изображении:

Для старых версий OpenWRT (например, 19.07) и, в некоторых случаях это можно сделать и для новых версий, настройка DNS осуществляется так:
В web-интерфейсе OpenWRT, в разделе верхнего меню: Network → Interfaces, нажмаем кнопку Edit напротив интефейса WAN, в появившемся диале выбираем вкладку Advanced Setting, снимаем галочку напротив пункта Use DNS servers advertised by peer и также прописываем адреса DNS серверов Google и OpenDNS. То же самое можно сделать и для интерфейса LAN, если Вы хотите чтобы устройства, которые Вы будете подключать к этому роутеру, получили по DHCP адреса DNS серверов Google и OpenDNS.

2) Устанавливаем все пакеты, которые нужны для работы USB звуковой карты, включая madplay, который вместе с wget’ом и будет проигрывать mp3 поток интернет-радиостанции:

opkg install kmod-sound-core kmod-usb-audio kmod-input-core kmod-input-evdev madplay alsa-utils triggerhappy kmod-hid kmod-usb-hid


Мы будем использовать простую USB звуковую карту за $1-$2, например, эту с Aliexpress: USB звуковая карта.
Также обновим wget, это небходимо сделать для старых версий OpenWRT (например, для версий, ранее 19.07), если Вы хотите слушать аудио-потоки, которые передаются по протоколу https:

opkg upgrade wget

3) Если мы хотим, чтобы наш роутер подключался к сети Интернет черз Wi-Fi домашней сети, а не работал по витой паре (Ethernet), то нам необходимо перевести модуль Wi-Fi роутера в режим client. Это можно сделать в web-интерфейсе OpenWRT, в разделе верхнего меню:

Network → Wireless, далее нажимаем на кнопку Edit, напротив того интерфейса Wi-Fi, с помощью которого мы бы хотели подключаться к домашней Wi-Fi сети.
И переводим этот модуль Wi-Fi в режим client, выбирая из выпадающего списка Mode режим client.

В поле ESSID вводим имя домашней Wi-Fi сети, а во вкладке Wireless security выбираем тип шифрования и вводим пароль домашней Wi-Fi сети.

Нажимаем кнопку Save в правом нижнем углу, затем, после того как диалог Device Configuration изчезнет, на странице нажимаем кнопку Save & Apply в правом нижнем углу.

Теперь Ваш роутер должен подключиться к домашней Wi-Fi сети и выходить в сеть Интернет через неё. Не забудьте оключить патч-корд, соединяющий роутер, который будет Wi-Fi интернет-радиоприёмником, и роутер домашней сети. Вы можете проверить подключение по Wi-Fi выполнив команду:

ping altavista.com


Подключаем USB звуковую карту

Теперь подключаем USB звуковую карту в USB разъём роутера. К выходу звуковой карты подключаем колонки. При необходимости, если колонки активные и питаются от USB, подключаем колонки к USB, для того чтобы напряжение питания поступило на усилитель низкой частоты колонок.

Здесь я использовал USB hub для того, чтобы подключить USB звуковую карту и активные колонки к единственному USB разъёму роутера. Не обошлось и без синей изоленты.

Перезагружаем роутер

Наберите в ssh консоли роутера reboot или перезагрузите роутер через web-интерфейс, на странице:

⠀https://192.168.1.1/cgi-bin/luci/admin/system/reboot
⠀http://192.168.1.1/cgi-bin/luci/admin/system/reboot, в случае старой версии OpenWRT


Первое проигрывание аудио-потока

Подключаемся к роутеру по ssh, как мы это делали ранее и напишем такую команду:

wget --no-check-certificate -q -O - https://mpc1.mediacp.eu:8404/stream | madplay - -Q --no-tty-control

Здесь⠀https://mpc1.mediacp.eu:8404/stream — это URL mp3 аудио-потока интернет-радиостанции.
Приведу ещё два аудио-потока для тестирования:
⠀http://radio.m-1.fm/raduga/high⠀http://i6.streams.ovh:16012/stream

wget подключается к серверу интернет-радиостанции, не проверяя SSL-сертификат (--no-check-certificate), не сообщает о своём статусе в консоли (-q), вывод скачивающегося аудио-потока отправляет в STDOUT (-O -). Далее, через pipe (|), аудио-поток попадает в madplay и он, не сообщая о своём статусе в консоли (-Q) и не реагируя на нажатия кнопок (--no-tty-control) декодирует поток mp3 и данные попадают в USB звуковую карту.
Для того, чтобы остановить воспроизведение дважды нажмите

Ctrl+c

Если мы хотим проигрывать аудио-поток в URL которого входят такие символы как '? &! # $ ' () * +, /:; = @ [ ]' (RFC 3986), то этот URL необходимо взять в кавычки ' '.

Автоматическое подключение к потоку при включении роутера

В Linux есть файл, в который можно добавить команды, которые будут выполняться при старте системы. В OpenWRT и в некоторых других дистрибутивах это файл rc.local, он находится в директории /etc:

/etc/rc.local

Доступ к нему можно получить и в web-интерфейсе OpenWRT:

System → Startup, вкладка Local Startup

Добавим в этот файл перед строкой exit 0 любую команду и она выполниться при загрузке OpenWRT. Для сохранения файла нажимаем кнопку Save.

Переподключение к аудио-потоку при разрыве соединения и переключение между двумя станциями

Переключение между двумя станциями осущетвляется благодаря тому, что в OpenWRT есть файл, в котором хранится значение яркости светодиода отвечающего за индикацию подключения клиентских устройств к сети LAN. Если мы подключим патч-кордом компьютер к роутеру, например, в гнездо LAN4, то на панели роутера загорится четвёртый светодиод.
Воспользуемся этим, в консоли подключимся к роутеру и посмотрим в директории

cd /sys/devices/platform/leds/leds/имя_модели_роутера:lan/

на файл brightness, в нём-то и хранится значение яркости индикации светодиода LAN, значение от 0 до 255. Мы можем узанать включён или выключен этот светодиод командой

cat /sys/devices/platform/leds/leds/имя_модели_роутера:lan/brightness

Чтобы посмотреть какие директории есть в каталоге /sys/devices/platform/leds/leds/ перейдите в этот каталог командой

cd /sys/devices/platform/leds/leds/

затем наберите

ls

Теперь мы можем управлять состоянием светодиода и тем значением, которое записано в файле brightness в OpenWRT.

Напишем bash скрипт, который поместим в файл /etc/rc.local, в котором будет осуществляться подключение к аудио-потоку, проигрывание, переподключение, при разрыве соединения и переключение между двумя интернет-радиостанциями.


# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

echo "#!/bin/sh" > /tmp/checkOnline
echo "if ( ! ping -c 8 8.8.8.8 > /dev/null 2>&1 ) ; then echo 'network down'; sh /tmp/killPlayer; else echo 'network up'; fi;" >> /tmp/checkOnline
echo "if ( ! pgrep -x madplay > /dev/null 2>&1 ) ; then echo 'player down'; sh /tmp/killPlayer; else echo 'player up'; fi" >> /tmp/checkOnline
chmod +x /tmp/checkOnline

echo "#!/bin/sh" > /tmp/killPlayer
echo "/usr/bin/killall -9 wget madplay;
sleep 1;
echo 'start playRadio';
sh /tmp/playRadio &" >> /tmp/killPlayer
chmod +x /tmp/killPlayer

echo "#!/bin/sh" > /tmp/switchRadioTimer
echo "while true
do
 STATE=\`cat /sys/devices/platform/leds/leds/tl-wr842n-v5:green:lan/brightness\`
 OLDSTATE=\`cat /etc/oldStationSwitchState\`
 if [ "\$STATE" != "\$OLDSTATE" ] ; then echo \$STATE > /etc/oldStationSwitchState; sh /tmp/killPlayer; fi;
 sleep 1
done" >> /tmp/switchRadioTimer
chmod +x /tmp/switchRadioTimer

echo "#!/bin/sh" > /tmp/playRadio
echo "OLDSTATE=\`cat /etc/oldStationSwitchState\`
URL='http://radio.m-1.fm/raduga/high'
if [[ \$OLDSTATE -gt 0 ]] ; then URL='http://i6.streams.ovh:16012/stream'; fi;
wget --no-check-certificate -q -O - \$URL | madplay - -Q --no-tty-control" >> /tmp/playRadio
chmod +x /tmp/playRadio

echo "#!/bin/sh" > /tmp/checkOnlineTimer
echo "while true
do
 sh /tmp/checkOnline
 sleep 20
done" >> /tmp/checkOnlineTimer
chmod +x /tmp/checkOnlineTimer

sleep 5; /tmp/playRadio &
sleep 5; /tmp/switchRadioTimer &
sleep 5; /tmp/checkOnlineTimer &

exit 0

Здесь, в директории /tmp мы создаём исполняемые файлы скриптов: checkOnline, killPlayer, switchRadioTimer, playRadio, checkOnlineTimer.

checkOnline — скрипт, который проверяет, пингуется ли DNS сервер Google и запущен ли madplay. Если не выполнено хотя бы одно из этих условий, тогда выполняется killPlayer.

killPlayer — завершает выполнение madplay и запускает скрипт playRadio.

playRadio — читает из текстового файла /etc/oldStationSwitchState номер станции, который нужно проигрывать и в зависимости от этого проигрывает либо поток №1, либо поток №2.

switchRadioTimer — скрипт, который в бесконечном цикле, каждую секунду проверяет состояние светодиода LAN4, который загорается при замыкании цепи нашим переключателем — station switch; затем, скрипт стравнивает считанное состояние переключателя со значением, которое хранится в файле /etc/oldStationSwitchState, если это разные значения, то значение состояния переключателя сохраняется в файл /etc/oldStationSwitchState и вызвается killPlayer.

checkOnlineTimer — раз в 20 секунд провереряет работает ли madplay с помощью скрипта checkOnline.

Все файлы скриптов созданы — запустим playRadio, switchRadioTimer и checkOnlineTimer.

После того, как мы сохранили /etc/rc.local необходимо создать файл /etc/oldStationSwitchState с нулевым значением. Это можно сделать в консоли OpenWRT:

echo 0 > /etc/oldStationSwitchState


Wi-Fi интернет-радиоприёмник внутри и снаружи

Поместим USB звуковую карту, усилитель низкой частоты, регулятор громкости и переключатели внутрь корпуса Wi-Fi роутера; смонтируем audio jack 3.5 мм на задней панели:

Так выглядит Wi-Fi интернет-радиоприёмник в собранном виде:

Проверим, как работает Wi-Fi интернет-радиоприёмник:

Смотрите, пожалуйста, видео работы Wi-Fi интернет-радиоприёмника (файл mp4). (Пользуюсь старым хаброредактором, не могу встроить видео-файл, тег oembed не поддерживает просто вставку видео-файла.)
Эта статья на английском языке на Хабре: Wi-Fi internet radio from a router with station switching capability.
Эта статья на моём сайте: Wi-Fi интернет-радиоприёмник из роутера с возможностью переключения станций. (С разрешения администраторов Хабрахабра.)

© Habrahabr.ru