середу, 24 вересня 2014 р.

WI-FI радіоприймач власноруч з роутера TP-LINK TL-MR 3020

Не всі радіостанції транслюють в ефір, і це не дивно бо він не гумовий. Наразі в Україні можна порахувати на пальцях радіо станції які транслюють якісні українські пісні. Але не біда, адже є ще інтернет радіо трансляції. Так от, настав такий момент в моєму житті коли вмикати ком'ютера, щоб послухати, наприклад, улюблене "Радіо з Криївки" стало ліньки, а от бажання лишилося. Тоді одразу поліз на Amazon шукати щастя. І знайшов його всього лище за 250-300 $. Можливо ціна і невелика для пересічного американця, але не для пересічного українця. Після цього я почав копати інтернет у пошуках саморобної альтернативи. І знайшов як реалізувати бажане вже за 250-300 грн.




Отже, беремо:
  1.  Роутер TL-MR 3020 
  2. USB-аудіо плату
  3. Колонки
Далі робимо з роутера "BusyBox", такий собі міні-комп. Тобто перепрошиваємо його на OpenWRT. Одразу скажу я користувався збіркою CyberWRT, що базується на OpenWRT, тому буду описувати побудову WI-FI радіоприймача саме на цій прошивці. Також завантажити CyberWRT якою прошився я можна також тут.
Після перепрошивки мусимо прописати налаштування. Можна прописати їх через Web-інтерфейс зайшовши на роутер за-помовчанням: http://192.168.1.1/, а можна через Telnet.

Якщо ви все ж вирішили прописати мережеві налаштування через telnet то спочатку прописуємо налаштування інтерфейсу мережі vi /etc/config/network

  1. config interface 'wwan'  
  2. option proto 'static'  
  3. option netmask '255.255.255.0'  
  4. option dns '8.8.8.8'  
  5. option ipaddr '177.77.17.100'  
  6. option gateway '177.77.17.1'  
Де ip-адреса 177.77.17.1 - це адреса Wi-FI роутера, до якого ви будете під'єднуватися.

Далі прописуємо налаштування WI-FI мережі: vi /etc/config/wireless

  1. config wifi-iface  
  2.  option device 'radio0'  
  3.  option mode 'sta'  
  4.  option network 'wwan'  
  5.  option ssid 'Fortetsya'  
  6.  option key 'Jgtyutqvth'  
  7.  option encryption 'psk2+aes'  
Де:  option mode 'sta' - це тип вашого під'єднання до роутера, тобто wi-fi радіоприймач під'єднується в режимі клієнта. Оption ssid 'Fortetsya' - відповідно назва вашої wi-fi мережі. Option key 'Jgtyutqvth' - ваш пароль від мережі. Оption encryption 'psk2+aes' - тип кодування паролю.

Далі заходимо на Wi-fi радіоприймач через WI-FI і завантажуємо драйвери для usb-аудиоплати. Якщо у вас прошивка CyberWRT, раджу не вигадувати велотранспорт і зайти через web-інтерфейс і встановити у відповідному розділі

Після цього заходимо в telnet і встановлюємо аудіоплеєр Madplay:

  1. opkg update  
  2. opkg install madplay  
Перевірити що все працює можна такою командою:

  1. wget -q -O- http://stream.mjoy.ua:8000/radio-z-kryjivky | madplay - -Q --no-tty-control &  
 Якщо заграло то у вас все добре і можна продовжувати. Створюємо файл radio-stop.sh в теці wifiradio. vi /etc/wifiradio/radio-stop.sh


  1. #!/bin/sh  
  2. killall radio-play.sh  
  3. killall radio-pingme.sh  
  4. killall wget  
 Не забуваємо для всіх файлів, що будуть виконуватися тобто з розширенням .sh прописати chmod 777. 
Після цього створюємо файл vi /etc/wifiradio/playlist.m3u . В ньому буде збережено всі радіостанції та їхні назви.

  1. #EXTM3U  
  2.  
  3. #EXTINF:0,"Ukrainian national radio"   
  4. http://nrcu.gov.ua:8000/ur1-mp3   
  5.  
  6. #EXTINF:0,"Radio from bunker"  
  7. http://stream.mjoy.ua:8000/radio-z-kryjivky   
  8.  
  9. #EXTINF:0,"E-radio"  
  10. http://62.149.13.129:8500/eradio_hi   
  11.  
  12. #EXTINF:0,"E-radio rock"  
  13. http://etoradio.cc.colocall.com:8500/e-rock_hi   
  14.  
  15. #EXTINF:0,"Radio Rocks"  
  16. http://online-radioroks.tavrmedia.ua/RadioROKS   
  17.  
  18. #EXTINF:0,"Holos Svobody"  
  19. http://holos.fm:8000/holos  
  20.  
  21. #EXTINF:0,"Ouch-Radio"  
  22. http://online.uhradio.com.ua:8001/efir  
  23.  
  24. #EXTINF:0, "M Radio"  
  25. http://stream.mjoy.ua:8000/radio-m  
  26.  
  27. #EXTINF:0, "My Radio"  
  28. http://music.myradio.ua/PopRock_news128.mp3  
Важливо саме у такій послідовності та з пробілами між різними радіостанціями бо скрипт буде не правильно відпрацьовувати.
Після цього створимо файл currstream.m3u з 4-ю в ньому командою: echo "4" > /etc/wifiradio/currstream.m3u . Цей файл потрібен для того, щоб визначити яку радіостанцію треба увімкнути скрипту radio-play.sh.

Після цього створюємо файл vi /etc/wifiradio/radio-play.sh

  1. #!/bin/sh  
  2. while truedo  
  3. pl=/etc/wifiradio/playlist.m3u  
  4. cur=$(cat "/etc/wifiradio/currstream.m3u")  
  5. curnm=$(($cur - 1))  
  6. name=$(head -n $curnm $pl | tail -n 1 | cut -c 11-)  
  7. nameg=$(echo ${name// /%20})  
  8. wget -U "Mozilla/5.0" -O /etc/wifiradio/nazva.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=Now%20you%20listen%20to%20$nameg"
  9. madplay /etc/wifiradio/nazva.mp3  
  10. st=$(head -n $cur $pl | tail -n 1)  
  11. wget -c -q -O - $st 2>/dev/null| madplay -q  -  
  12. killall wget  
  13. done  
Принцип цього скрипта полягає в тому що, він в нескінченному циклі читає плейлист, щоб визначити адреси радіостанцій та їх назви /etc/wifiradio/playlist.m3u потім читає файл /etc/wifiradio/currstream.m3u, щоб визначити яку станцію треба зараз увімкнути. Перед тим як почати грати станцію голосовий google-рушій промовляє назву радіостанції.

Далі створюємо скрипт перемикання з однієї станції на іншу: vi /etc/wifiradio/radio-next-station.sh

  1. #!/bin/sh  
  2. killall wget  
  3. pl=/etc/wifiradio/playlist.m3u  
  4. max=$(wc -l "$pl")  
  5. cur=$(cat /etc/wifiradio/currstream.m3u)  
  6. maxnumb=$(echo "$max" | cut -c1-2)  
  7. if [ "$cur" -lt "$maxnumb" ]  
  8.         then  
  9.                 nx=$(($cur+3))  
  10.         fi  
  11. if [ "$cur" -ge "$maxnumb" ]  
  12.         then  
  13.                 nx=4                  
  14.         fi  
  15. echo "$nx" > /etc/wifiradio/currstream.m3u  
Цей скрипт вбиває потік плеєра і прочитавши кількість строк в плейлисті і теперішню строчку, що грала, перемикає на через 3 строчки на іншу станцію, якщо ця станція не остання (От чому такий важливий порядок запису станцій в плейлисті). А якщо ж станція остання, то перемикає на першу станцію. Звісно записавши зміни до файлу /etc/wifiradio/currsteam.m3u, щоб запам'ятати станцію, що програється.

Якщо у вас хоч на деякий час обірветься інтернет, то музика припинить грати, але плеєр не розірве з'єднання, бо потік існує, і так приймач може зависнути на довго, щоб цього не було стуворимо скрипт: vi /etc/wifiradio/radio-pingme.sh

  1. #!/bin/sh  
  2. while truedo  
  3. sleep 1  
  4. if ! ping -q -c 2 -W 6 google.com.ua > /dev/null; then  
  5. ifdown wan  
  6.  sleep 10  
  7.         killall wget   
  8. fi  
  9. done  
Цей скрипт в нескінченному циклі пінгує адресу google.com.ua, і якщо цей домен не відповідає, то чекає 10 секунд і обриває потік, потім якщо нічого не змінилося процес повторюється.

Тепер створимо скрипт який буде стартувати з завантаженням роутера і запускати наші скрипти у фоновому режимі: vi /etc/wifiradio/radio-load.sh

  1. #!/bin/sh  
  2. killall wget  
  3. killall radio-play.sh  
  4. /etc/wifiradio/radio-play.sh $1 &  
  5. /etc/wifiradio/radio-pingme.sh $1 &  
В решті-решт у нас існує ще кнопка WPS на роутері, треба її запрограмувати щоб вона виконувала якісь корисні функції. Я вирішив для себе:

  • 1 секунда натиску - перемикає станцію
  • 2-4 секунди утримувати кнопку - вмикає радіо
  • 5-18 секунд утримувати кнопку - вимикає радіо
Тепер напишемо такий скрипт  vi  /etc/hotplug.d/button/00-button . Тут треба уважно прочитати цей розділ в мене версія OpenWRT новіша від r34793 тому я пишу ./etc/functions.sh якщо у вас прошивка старша за r34793 вам треба писати ./lib/functions.sh

  1. ./etc/functions.sh  
  2. do_button () {  
  3.         local button  
  4.         local action  
  5.         local handler  
  6.         local min  
  7.         local max  
  8.         config_get button $1 button  
  9.         config_get action $1 action  
  10.         config_get handler $1 handler  
  11.         config_get min $1 min  
  12.         config_get max $1 max  
  13.         [ "$ACTION" = "$action" -a "$BUTTON" = "$button" -a -n "$handler" ] && {  
  14.                 [ -z "$min" -o -z "$max" ] && eval $handler  
  15.                 [ -n "$min" -a -n "$max" ] && {  
  16.                         [ $min -le $SEEN -a $max -ge $SEEN ] && eval $handler  
  17.                 }  
  18.         }  
  19. }  
  20. config_load system  
  21. config_foreach do_button button  
Тепер допишемо в налаштуваннях потрібні витримки часу vi /etc/config/system

  1. config button  
  2.         option button 'wps'  
  3.         option action 'released'  
  4.         option handler '/etc/wifiradio/radio-next-station.sh'  
  5.         option min '0'  
  6.         option max '1'  
  7.                                           
  8. config button  
  9.         option button 'wps'  
  10.         option action 'released'  
  11.         option handler '/etc/wifiradio/radio-load.sh'  
  12.         option min '2'  
  13.         option max '4'  
  14.                                                                                  
  15. config button  
  16.         option button 'wps'  
  17.         option action 'released'  
  18.         option handler '/etc/wifiradio/radio-stop.sh'  
  19.         option min '5'  
  20.         option max '18'  
  21.                                           
  22. config button  
  23.         option button 'wps'  
  24.         option action 'released'  
  25.         option handler 'logger wifi, timed pressed: 19-50s'  
  26.         option min '19'  
  27.         option max '50'                                           
Принагідно можна виправити назву пристрою (за бажанням) та часову зону, яка за помовчанням стоїть UTC
  1. config system  
  2.  option hostname 'WIFI-Radio'  
  3.  option timezone 'EET-2EEST,M3.5.0/3,M10.5.0/4'  
Свою часову зону можна обрати тут по таблиці. У мене звісно вибрана часова зона України.
В принципі все.
Ще така деталь, мені було принципово, щоб приймач вмикався о 6й ранку і о 12 ночі сам вимикався, тому я написав кроні розклад crontab -e

  1. 0 6 */1 * * /etc/wifiradio/radio-load.sh  
  2. 0 0 */1 * * /etc/wifiradio/radio-stop.sh  

Список використаних джерел:

  1. OpenWRT Docs
  2. Форум Умный дом
  3. Lexxai blog OpenWRT, TP-Link 1043 - INTERNET RADIO tuner
  4. IVT-2009 blog IP радио из роутера TP-LINK 3020
  5. Laferont blog Напоминалки
  6. OpenWrt Failsafe
  7. How To Make A Cheap WiFi Radio
  8. Forum [HowTo] Cheap Stereo WiFi Internet radio & MP3 player Tplink TL-MR3020
  9. Joseph Innovations blog Internet Radio -> Router + USB Sound-card
  10. Klasseonline Using the Asus WL-500g as Internet Radio Station
  11. Habrahabr Сделай сам: Wi-Fi-радио своими руками
  12. MightyOhm Building a Wifi Radio

29 коментарів:

  1. Відповіді
    1. Дякую, що знайшли мою помилку, я не все скопіював з файлу. Тепер там все вірно. Якщо треба детальніше прокоментувати код питайте, я можу від самого початку.

      Видалити
    2. добрий день могли б мені допомогти у створенні wifi радіоприймача на основі openwrt 15,05 і роутера asus wl-500g Все роблю за Вашими інструкціями, але не виходить, паку /etc/radiotuner або /etc/wifiradio потрібно самому створювати і вній ті файли скрипти, що в описі, і як тоді воно буде завнтажуватись із роутером?

      Видалити
  2. Здравствуйте, прочитал вашу статью и решил сделать радио на кухню. Купил роутер TP-LINK TL-MR 3020, звуковая карта была, прошил, поставил плеер, радио заиграло. Делаю все по вашей инструкции, в линуксе чайник чуть запутался, подскажите что надо прописать в файле currstream.m3u? Спасибо.

    ВідповістиВидалити
    Відповіді
    1. номер радіостанції який буде грати зараз з playlist.m3u, тобто там повинно бути число, наприклад 4.

      Видалити
  3. Відповіді
    1. Так.

      Ось текст статті:
      "Після цього створимо файл currstream.m3u з 4-ю в ньому командою: echo "4" > /etc/wifiradio/currstream.m3u . Цей файл потрібен для того, щоб визначити яку радіостанцію треба увімкнути скрипту radio-play.sh."


      echo "4" > /etc/wifiradio/currstream.m3u - вивести 4 на екран і переадресувати результат виводу до файлу.

      Видалити
  4. Тут я запутался в файле прописать (echo "4" >) или просто (4)

    ВідповістиВидалити
  5. Прописал echo "4" перезагружаю тишина, подскажите какой командой посмотреть что скрипты запустились?

    ВідповістиВидалити
  6. Спасибо за помощь все заработало, единственное не работает голосовое озвучивание станций ссылка не рабочая, если есть рабочая ссылка поделитесь.

    ВідповістиВидалити
    Відповіді
    1. Думаю вже не буде працювати, на послання http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=Now%20you%20listen%20to%20UARadio
      Ви чуєте звук, я - ні. Тому що google захистило введенням коду.

      Видалити
  7. интересно а другие голосовые движки можно прикрутить?

    ВідповістиВидалити
    Відповіді
    1. Шукайте, потрібно мати любий URL щоб генерував mp3.

      Видалити
    2. добрий день могли б мені допомогти у створенні wifi радіоприймача на основі openwrt 15,05 і роутера asus wl-500g Все роблю за Вашими інструкціями, але не виходить, паку /etc/radiotuner або /etc/wifiradio потрібно самому створювати і вній ті файли скрипти, що в описі, і як тоді воно буде завнтажуватись із роутером?

      Видалити
    3. Запуск реалізований через опрацювання натискання кнопки /etc/hotplug.d/button ...
      Але спочатку треба перевірити щоб грала музика простим запуском скриптів.

      або запуском з публікації автора:

      Перевірити що все працює можна такою командою:

      1. wget -q -O- http://stream.mjoy.ua:8000/radio-z-kryjivky | madplay - -Q --no-tty-control &

      Якщо заграло то у вас все добре і можна продовжувати...

      Видалити
    4. Дякую, зрозумів, тепер буду шукати в цьому напрямку перепрограмування кнопки, бо я неправильно зрозумів, що повинно запускатись із увімкненням роутера, а так радіо через команду працює.

      Видалити
    5. Для того щоб скрипт завантажувався при старті роутера, його повний шлях треба прописати в файл /etc/rc.local

      Видалити
    6. Дякую за допомогу, буду пробувати.

      Видалити
  8. Здравствуйте. Подскажите пожалуйста как организовать переключение радиостанций с помощью телефона на андроиде?

    ВідповістиВидалити
  9. "якісні українські пісні"- это ты о чем? Такое вообще существуют? Ты ничего не напутал?

    ВідповістиВидалити
  10. Добрий день, прошу ще допомогти у налаштуванні кнопки увімкнення і перемикання каналів. Роблю все відповідно Вашої інструкції і відповідно інструкцій на wiki.openwrt.org щодо налаштування кнопки, знаходжу її через logread -f називається wps бачу дії - натиснуто відпущено, все прописую та скрипт не спрацьовує, і вже не можу зрозуміти чи це той, що у etc/hotplug.d/button/00-button чи параметри для різного функціоналу з залежності від тривалості натискання клавіші WPS /etc/config/system.

    ВідповістиВидалити
  11. Все, вибачте, запрацювало, дякую.

    ВідповістиВидалити
  12. Як це радіо працює в 2021 році? Є сенс заморочуватись?

    ВідповістиВидалити
    Відповіді
    1. А чому ні? воно працює собі. Якщо вам хочеться зробити щось власноруч, а не купляти готовий варіант. До того ж це дешевше ніж вже готові аналоги. І на скільки знаю то в Україні продаються здебільшого китайські wi-fi радіоприймачі, які не дуже щоб адаптовані під нашого користувача.

      Видалити
  13. Так, працює все чудово, час від часу потрібно корегувати плейлист, оскільки деякі потоки пропадають.

    ВідповістиВидалити