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:
Также обновим 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 интернет-радиоприёмник из роутера с возможностью переключения станций. (С разрешения администраторов Хабрахабра.)