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
Переключатель станций — station switch. Подпаяем провода к четырём выводам 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 интернет-радиоприёмник.

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

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

Комментарии (14)


  1. Javian
    12.08.2023 16:14

    Off имхо лучше использовать USB звуковую карту с FM-модулятором.
    Это позволит слушать собственную радиостанцию на обычный FM-радиоприемник в радиусе 5-10 метров от роутера. Рекомендую такое решение если делаете интернет-радио для пожилого человека.


    1. unitReady Автор
      12.08.2023 16:14
      +1

      Добрый вечер, Javian. Да, это интересно, но тогда проще слушать со смартфона или планшета, установить приложение радио.
      Я подарил этот Wi-Fi интернет-радиоприёмник своему давнему знакомому, ему больше 70-ти лет, Wi-Fi интернет-радиоприёмник у него стоит на кухне. Он, со своей женой, слушает по нему разговорные радиостанции не вещающие в России.


      1. Javian
        12.08.2023 16:14
        +1

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


        https://habr.com/ru/articles/61880/
        https://habr.com/ru/articles/190422/
        https://habr.com/ru/articles/703414/


        1. unitReady Автор
          12.08.2023 16:14
          +2

          Доброе утро, 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 лет.


          1. Javian
            12.08.2023 16:14

            В эти SVEN SPS-614 вполне поместился бы роутер. Особенно если колонок две — вторая у него пустая.


  1. microArt
    12.08.2023 16:14

    Хорошая вещь, сама пользуюсь.
    Можно управлять с подключенной клавиатуры, используя triggerhappy, или со смартфона, используя MPD (на Андроиде надо установить MPDroid).

    Пользуясь случаем, хочу спросить: а есть способ записать поток на подключенный внешний диск? Допустим, играет хорошая песня и хочется ее записать.


    1. unitReady Автор
      12.08.2023 16:14
      +1

      Добрый вечер, microArt.
      Вы можете это сделать с помощью, например, всё того же wget:
      wget -O song.mp3 https://mpc1.mediacp.eu:8404/stream
      по окончании, нажмите ctrl+c дважды.


  1. aik
    12.08.2023 16:14

    Роутер в меру мощный должен быть. В своё время делал подобное на тплинк 3020 — тому мощи не хватало. В итоге взял машинку первую.


    1. microArt
      12.08.2023 16:14

      "делал подобное на тплинк 3020 — тому мощи не хватало".

      У меня сейчас так работает: mr3020 третьей версии - все прекрасно.
      А если в роутер еще звуковую карту встроить, как здесь:
      https://habr.com/ru/post/184110/
      будет вообще замечательно.


      1. aik
        12.08.2023 16:14

        А у меня музыка заикалась. Какой версии 3020 был — сказать уже не могу.


  1. NNMTM
    12.08.2023 16:14
    +1

    Ещё бывают USB-звуковые карты с несколькими кнопками.
    Но пожалуй проще всего взять старую USB-клавиатуру, в идеале с мультимедийными кнопками (play, next,prev, и т.п.). И после отладки софта, использовать только платку от клавиатуры с распаянными нужными кнопками.


  1. vassabi
    12.08.2023 16:14

    статья хорошая, только один момент

    ChatGPT не использовался при написании этой статьи.

    вставлять вот такую фразу ChatGPT обучается так же медленно, как и вставлять фразу "Как искуственный интеллект, я не могу" ;)


    1. unitReady Автор
      12.08.2023 16:14
      +1

      Доброе утро, vassabi.

      Спасибо.

      <quote>вставлять вот такую фразу ChatGPT обучается так же медленно, как и вставлять фразу "Как искуственный интеллект, я не могу" ;)</quote>
      Вы могли бы переписать Вашу сентенцию с учётом пунктуации?


  1. vviz
    12.08.2023 16:14

    А если запустить vlc, то вообще получится медиаплейер.