Это моя статья, а не переводная статья. |
В этой статье Вы найдёте полное описание того, как сделать 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.
Настройка OpenWRT
1) Подключаемся к роутеру по ssh, для этого в консоли наберите: (пользователи ОС Windows могут воспользоваться коммандой ssh или putty)
и первым делом обновляем информацию о пакетах в ОС Linux: ssh root@192.168.1.1
Если команда выполняется с ошибками, то Вам необходимо прописать DNS. Это можно сделать в web-интерфейсе OpenWRT. К web-интерфейсу OpenWRT можно подключиться зайдя в браузере на страницу: opkg update
⠀https://192.168.1.1
Браузер может предупредить нас о самоподписанном сертификате, проигнорируем это, нажав на кнопку Anvanced и согласившись перейти на страницу входа в web-интерфейс OpenWRT. Авторизуемся без пароля.
⠀http://192.168.1.1, в случае старой версии OpenWRT
Для того, чтобы прописать DNS, в разделе верхнего меню: Network -> DHCP and DNS, на этой странице необходимо удалить записи DNS forwardings и добавить адреса DNS серверов, например адреса DNS серверов Google и OpenDNS: 8.8.8.8, 208.67.222.222, 208.67.220.220, как показано на изображении:
В 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.
Нажимаем кнопку Save в правом нижнем углу, затем, после того как диалог Device Configuration изчезнет, на странице нажимаем кнопку Save & Apply в правом нижнем углу.Теперь Ваш роутер должен подключиться к домашней Wi-Fi сети и выходить в сеть Интернет через неё. Не забудьте оключить патч-корд, соединяющий роутер, который будет Wi-Fi интернет-радиоприёмником, и роутер домашней сети. Вы можете проверить подключение по Wi-Fi выполнив команду:
ping altavista.com
Подключаем USB звуковую карту
Теперь подключаем USB звуковую карту в USB разъём роутера. К выходу звуковой карты подключаем колонки. При необходимости, если колонки активные и питаются от 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, как мы это делали ранее и напишем такую команду:
Здесь⠀https://mpc1.mediacp.eu:8404/stream — это URL mp3 аудио-потока интернет-радиостанции.wget --no-check-certificate -q -O - https://mpc1.mediacp.eu:8404/stream | madplay - -Q --no-tty-control
Приведу ещё два аудио-потока для тестирования:
⠀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:
Доступ к нему можно получить и в web-интерфейсе OpenWRT: /etc/rc.local
System -> Startup, вкладка Local Startup
Переподключение к аудио-потоку при разрыве соединения и переключение между двумя станциями
Переключение между двумя станциями осущетвляется благодаря тому, что в OpenWRT есть файл, в котором хранится значение яркости светодиода отвечающего за индикацию подключения клиентских устройств к сети LAN. Если мы подключим патч-кордом компьютер к роутеру, например, в гнездо LAN4, то на панели роутера загорится четвёртый светодиод.
Воспользуемся этим, в консоли подключимся к роутеру и посмотрим в директории
на файл brightness, в нём-то и хранится значение яркости индикации светодиода LAN, значение от 0 до 255. cd /sys/devices/platform/leds/leds/имя_модели_роутера:lan/
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 роутера остаётся рабочим и его можно использовать для подключения внешних устройств, если переключатель будет разомкнут. |
Теперь мы можем управлять состоянием светодиода и тем значением, которое записано в файле 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 интернет-радиоприёмника (файл mp4). (Пользуюсь старым хаброредактором, не могу встроить видео-файл, тег oembed не поддерживает просто вставку видео-файла.)Эта моя статья на английском языке на Хабре: Wi-Fi internet radio from a router with station switching capability.
Эта моя статья на моём сайте: Wi-Fi интернет-радиоприёмник из роутера с возможностью переключения станций. (С разрешения администраторов Хабрахабра.)
Комментарии (14)
microArt
12.08.2023 16:14Хорошая вещь, сама пользуюсь.
Можно управлять с подключенной клавиатуры, используя triggerhappy, или со смартфона, используя MPD (на Андроиде надо установить MPDroid).Пользуясь случаем, хочу спросить: а есть способ записать поток на подключенный внешний диск? Допустим, играет хорошая песня и хочется ее записать.
unitReady Автор
12.08.2023 16:14+1Добрый вечер, microArt.
Вы можете это сделать с помощью, например, всё того же wget:wget -O song.mp3 https://mpc1.mediacp.eu:8404/stream
по окончании, нажмите ctrl+c дважды.
aik
12.08.2023 16:14Роутер в меру мощный должен быть. В своё время делал подобное на тплинк 3020 — тому мощи не хватало. В итоге взял машинку первую.
microArt
12.08.2023 16:14"делал подобное на тплинк 3020 — тому мощи не хватало".
У меня сейчас так работает: mr3020 третьей версии - все прекрасно.
А если в роутер еще звуковую карту встроить, как здесь:
https://habr.com/ru/post/184110/
будет вообще замечательно.
NNMTM
12.08.2023 16:14+1Ещё бывают USB-звуковые карты с несколькими кнопками.
Но пожалуй проще всего взять старую USB-клавиатуру, в идеале с мультимедийными кнопками (play, next,prev, и т.п.). И после отладки софта, использовать только платку от клавиатуры с распаянными нужными кнопками.
vassabi
12.08.2023 16:14статья хорошая, только один момент
ChatGPT не использовался при написании этой статьи.
вставлять вот такую фразу ChatGPT обучается так же медленно, как и вставлять фразу "Как искуственный интеллект, я не могу" ;)
unitReady Автор
12.08.2023 16:14+1Доброе утро, vassabi.
Спасибо.
<quote>вставлять вот такую фразу ChatGPT обучается так же медленно, как и вставлять фразу "Как искуственный интеллект, я не могу" ;)</quote>
Вы могли бы переписать Вашу сентенцию с учётом пунктуации?
Javian
Off имхо лучше использовать USB звуковую карту с FM-модулятором.
Это позволит слушать собственную радиостанцию на обычный FM-радиоприемник в радиусе 5-10 метров от роутера. Рекомендую такое решение если делаете интернет-радио для пожилого человека.
unitReady Автор
Добрый вечер, Javian. Да, это интересно, но тогда проще слушать со смартфона или планшета, установить приложение радио.
Я подарил этот Wi-Fi интернет-радиоприёмник своему давнему знакомому, ему больше 70-ти лет, Wi-Fi интернет-радиоприёмник у него стоит на кухне. Он, со своей женой, слушает по нему разговорные радиостанции не вещающие в России.
Javian
В таком возрасте нежелательно, чтобы у используемого устройства можно было что-то отсоединить. Выпавший кабель может быть большой проблемой. Поэтому уже знакомое и имеющийся радиоприемник им предпочтительнее, если нет возможности изготовить в едином корпусе как в этих статьях:
https://habr.com/ru/articles/61880/
https://habr.com/ru/articles/190422/
https://habr.com/ru/articles/703414/
unitReady Автор
Доброе утро, Javian.
https://habr.com/ru/articles/61880/ - это не статья, это 5 изображений с сайта https://mightyohm.com/blog/2009/05/building-a-wifi-radio-part-10-building-the-box/
https://habr.com/ru/articles/190422/ - ссылки на скрипты не открываются https://wifiradio.googlecode.com/svn/trunk/openwrt/setup_mpc_update.txt , ни какой конкретной инструкции по тому как сделать Wi-Fi интернет-радиоприёмник нет.
https://habr.com/ru/articles/703414/ - Колонки подключаются отдельно, об этом автор сам пишет в этой же статье:
В качестве колонок я использую SVEN SPS-614.
<quote>Поэтому уже знакомое и имеющийся радиоприемник им предпочтительнее</quote>
Что "им" предпочтительнее, они решают сами. Этот Wi-Fi интернет-радиоприёмник работает у этой интеллигентной пары с 4 высшими образованиями и докторскими степенями уже больше 1.5 лет.
Javian
В эти SVEN SPS-614 вполне поместился бы роутер. Особенно если колонок две — вторая у него пустая.