На главную страницу

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

Wi-Fi интернет-радиоприёмник

Что понадобится?

В этой статье Вы найдёте полное описание того, как сделать Wi-Fi интернет-радиоприёмник из роутера, который бы мог проигрывать mp3 потоки интернет-радиостанций.

Также предусмотрена возможность переключения между двумя интернет-радиостанциями. Мы будем использовать прошивку OpenWRT установленную на роутер для создания Wi-Fi интернет-радиоприёмника.Можно обойтись без паяльника, а можно поместить все элементы внутрь роутера и сделать завершённое устройство — 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. Роутер 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, как показано на изображении: Настройка DNS в OpenWRT. Для старых версий 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. Wi-Fi модуль в режиме 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, для того чтобы напряжение питания поступило на усилитель низкой частоты колонок. Wi-Fi роутер с подключённой 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 Редактирование файла /etc/rc.local в web-интерфейсе OpenWRT. Добавим в этот файл перед строкой exit 0 любую команду и она выполниться при загрузке OpenWRT. Для сохранения файла нажимаем кнопку Save.

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

Переключение между двумя станциями осущетвляется благодаря тому, что в OpenWRT есть файл, в котором хранится значение яркости светодиода отвечающего за индикацию подключения клиентских устройств к сети LAN. Если мы подключим патч-кордом компьютер к роутеру, например, в гнездо LAN4, то на панели роутера загорится четвёртый светодиод.
Воспользуемся этим, в консоли подключимся к роутеру и посмотрим в директории cd /sys/devices/platform/leds/leds/имя_модели_роутера:lan/ на файл brightness, в нём-то и хранится значение яркости индикации светодиода LAN, значение от 0 до 255. Файл brightness в директории :lan в OpenWRT. Мы можем узанать включён или выключен этот светодиод командой cat /sys/devices/platform/leds/leds/имя_модели_роутера:lan/brightness Чтобы посмотреть какие директории есть в каталоге /sys/devices/platform/leds/leds/ перейдите в этот каталог командой cd /sys/devices/platform/leds/leds/ затем наберите ls

Подпаяем провода к четырём выводам LAN4 (две витые пары), подключим эти 4 провода к переключателю (station switch на изображении "Wi-Fi интернет-радиоприёмник в открытом виде"). Переключатель будет коммутировать пару TX (Transmit) с парой RX (Receive) Wi-Fi роутера. Это гнездо Wi-Fi роутера остаётся рабочим и его можно использовать для подключения внешних устройств, если переключатель будет разомкнут.
Переключатель станций — station switch. Теперь мы можем управлять состоянием светодиода и тем значением, которое записано в файле 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 интернет-радиоприёмник в собранном виде:

Собранный Wi-Fi интернет-радиоприёмник.

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

Wi-Fi интернет-радиоприёмник