Найпростіша інтернет радіо колонка «Kodi» або порятунок «Малинової» цегли

Найпростіша інтернет радіо колонка «Kodi» або порятунок «Малинової» цегли

Основні передумови:

  1. Є стара невикористовувана плата Raspberry Pi першого покоління;
  2. Плата лежить на шафі мертвим вантажем і не використовується - плата «Цегла»;

Що хотілося б отримати:

  1. У певний час (наприклад за настроєм)
    плата перестає бути «Цегла», і в неї вставляється чарівна карта пам'яті;
  2. До плати підключається кабель Ethernet і штекер від звичайної побутової колонки або навушників;
  3. Після подачі харчування колишня «Цегла» співає

Основна ідея:

  1. Мінімальна кількість рухів тіла для будь-якої настройки, в ідеальному випадку, підключаємо тільки «Ethernet» кабель, живлення і колонки, і більше нічого не робимо, від слова «зовсім»;
  2. Колишню «Цеглу» з коробки підтримуємо наприклад 20 інтернет радіостанцій, перемикання яких по колу можна повісити на натискання коліщатка миші або на певний pin GPIO (підключити два дроти і їх замкнути (моя мрія з дитинства));
  3. Управління здійснюється по радіо каналу, і цим радіоканалом може стати звичайна радіо миша;
  4. Взяти вже готову систему, дистрибутив зібрати у «Yocto Project»
    тобто. як завжди ми з вами нічого робити не будемо, тому що все вже зроблено.
    (достатньо лише помістити стороннього спостерігача з іншого боку «Телевізора»);

Опис

Найпростіша Інтернет Радіо колонка «KODI»
Складання призначене для старих Raspberry Pi 1 плат
(пиляться десь на шафі, але які готові ще попрацювати)

За замовчуванням використовується список m3u8 із 12 Інтернет радіостанцій.

Передбачається, що плата працює без HDMI виходу, і для її вимкнення достатньо висмикнути адаптер живлення з розетки. А як ультра сучасний бездротовий пульт управління, ви можете використовувати вашу супер радіо мишу (ну або підключити звичайну сіру з хвостом).

При включенні мережний інтерфейс за замовчуванням налаштовується через DHCP протокол і програється остання запам'ятована радіостанція зі списку, керування гучністю відтворення здійснюється звичайною мишею:
(призначте нарешті свою мишу «начальницею управління», і привітайте її, вона це заслужила)

  колесико вперед  - увеличение громкости звука
  колесико назад   - уменьшение громкости звука
  длительное нажатие (3сек и более) на правую кнопку мыши
                   - выбор следующий радиостанции
  длительное нажатие (3сек и более) на левую кнопку мыши
                   - выбор предыдущей радиостанции

Для додавання власного списку Інтернет радіостанцій
ви завжди можете підключити HDMI кабель від телевізора
та скористатися штатним графічним інтерфейсом Kodi 17.6
(вимкніть плату, підключіть HDMI та увімкніть адаптер живлення)

Основне меню Kodi => "Додатки" => "Мої доповнення"
          => «Клієнти PVR» => «PVR IPTV Simple Client»

Початкова реалізація

(можлива)
Спочатку, коли я вирішив зробити «Інтернет радіо колонку», я планував наступне:

  • Мінімалістичний консольний дистрибутив у Yocto Project;
  • Аудіо потік програється через GStreamer;
  • Мережевий інтерфейс налаштовується DHCP;

І таке рішення має низку переваг:

  1. Достатньо швидке (вихід на робочий режим від подачі живлення 30-40сек);
  2. Достатньо надійне (менше програм, менше точок відмови);
  3. Консольний дистрибутив набагато простіше перевести в режим читання
    тобто. програми нічого не записують у кореневу у файлову систему
    (a файлова система на носії SDHC є на мій погляд першим кандидатом з відмов);

Примітка:

    В Yocto перевести корневую файловую систему (rootfs) 
    в режим только чтение можно сделать достаточно просто, 
    изменив один параметр во время сборки 

    Из коробки Yocto предлагает два варианта:
    1) Работа файловой системы в обычном режиме чтение/запись 
    (так работают все дистрибутивы общего назначения, например Ubuntu)
    2) Работа файловой системы в режиме только чтение
    (так работают специализированные дистрибутивы, например в маршрутизаторах)

    В режиме только чтение все каталоги, в которые обычно 
    записываются данные приложений и сервисов во время работы монтируются 
    в оперативную память (например каталог /var/log и т.п.)
    Данные актуальны только для текущего сеанса работы и после сброса питания
    данные теряются.

    Если в Yocto Project вы укажете при сборке использовать "read only", 
    то после сборки ваш дистрибутив будет настроен только на чтение, 
    но вы всегда можете добавить возможность динамического перевода 
    из "read only"  в "read/write", но это уже совсем другая история ...
    

І один головний недолік:

"Його треба робити" тобто. мені необхідно витратити N кількість вечорів
(зазвичай після роботи, і це найнеефективніший час, у цей час мозок, вже не думає, він зазвичай спить)

І ще свою попередню статтю на Хабрі я писав про мультимедіа центр Kodi та Yocto проект
і можливість продовжити у тому ж ключі, пересилила мій дослідницький порив. Про це у наступному розділі.

Перетворення Kodi на інтернет радіо колонку

Для внесення потрібної мені функціональності, я додам ще один метод у рецепт складання дистрибутива, описаного в попередній статті див. файл berserk-image.bb

GUI_SETTINGS = "home/root/.kodi/userdata/guisettings.xml"

# конфигурация запуска последнего выбранного ТВ канала (1-фон 2-передний план)
F1_LINE = "<startlast default="true">0</startlast>"
R1_LINE = "<startlast>1</startlast>"
# конфигурация вывода звука, всегда подключен только аналоговый аудио выход
F2_LINE = "<audiodevice default="true">PI:HDMI</audiodevice>"
R2_LINE = "<audiodevice>PI:Analogue</audiodevice>"
# так как HDMI по умолчанию не используется отключаю автоматическое обновление
# а то может получиться что питание уехало, а данные остались не записанными
F3_LINE = "<addonupdates default="true">0</addonupdates>"
R3_LINE = "<addonupdates>2</addonupdates>"


# метод отвечает за добавление конфигурации:
# которая превращает "Умный телевизор" в "простую Интернет Радио колонку"
add_radio_guisettings() {
    sed -i "s|${F1_LINE}|${R1_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS}
    sed -i "s|${F2_LINE}|${R2_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS}
    sed -i "s|${F3_LINE}|${R3_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS}
}


FIND_STR = "touch ./tmp/.FIRST_RUN."
SCRIPT_FIRST_RUN = "etc/init.d/first-run.sh"
# так как HDMI выход может не использоваться, 
# то необходимо отключить "стартовое приветствие"
off_kodi_welcome() {
    sed -i "s|${FIND_STR}|#&|" ${IMAGE_ROOTFS}/${SCRIPT_FIRST_RUN}
}

Методи призначені для модифікації кореневої файлової системи перед формуванням образу дистрибутива у вигляді одного raw файлу, який записується на карту пам'яті командою dd

Це робиться таким чином:
ROOTFS_POSTPROCESS_COMMAND += «add_radio_guisettings; off_kodi_welcome;»

Якщо коротко, то в основному файлі конфігурації Kodi 17.6 змінюються «три пункти»

  • Конфігурація запуску останнього обраного ТВ каналу;
  • Конфігурація виводу звуку завжди підключений тільки аналоговий аудіо вихід;
  • Вимкнення автоматичного оновлення;
  • Примітка:
        Единственное с чем у меня возникли сложности, 
        это то, что пришлось еще подтащить файл базы данных 
        в формате sqlite => TV29.db, в котором указывается 
        текущий проигрываемый ТВ канал 
        (так как по умолчанию никакой из каналов не выбран), 
        а через xml конфигурацию в Kodi этого не сделать.
        

докладніша послідовність дій для кожного пункту:

1) Натисніть на значок «шестерні» у верхньому лівому куті екрана
і виберіть «Налаштування PVR та ТБ» (зображення телевізора з двома ріжками)
Далі в лівій частині меню виберіть пункт «Відтворення», а в центральній секції «Загальні»
вкажіть у списку «Продовжити з останнього каналу при запуску»
вибравши налаштування «Передній план»

або наочно:

      "Настройки PVR и ТВ" 
       => "Воспроизведение" 
       => "Продолжить с последнего канала при запуске" => "Передний план"

2) Натисніть на значок «шестерні» у верхньому лівому куті екрана і виберіть пункт:

       "Системные настройки"  
       => "Дополнения" => "Обновления" => "Никогда не проверять обновления"

3) Натисніть на значок «шестерні» у верхньому лівому куті екрана і виберіть пункт:

       "Системные настройки" 
       => "Аудио" => "Устройство вывода звука" => "PI: Analogue"

Як я два роки неправильно дивлюсь телевізор.

Маю визнати, що я за два роки так і не навчився правильно дивитися телевізор.

Зазвичай дивлюся телевізор на кухні. До телевізора підключено плату Raspberry Pi 2B, а до плати Ethernet та HDMI роз'єми. Живлення плати подається через звичайний USB кабель, який встромлять USB порт телевізора тобто. по суті, включення телевізора за допомогою штатного пульта дистанційного керування подає живлення і на плату Raspberry Pi, а відключення телевізора з пульта також відразу скидає живлення і з плати Raspberry Pi.

Так я чудово усвідомлюю, що так робити не можна, тому що коренева файлова система мультимедіа центру Kodi (ext3) у мене функціонує в звичайному режимі читання/запис. Але я людина лінива, і для початку я вирішив перевірити наскільки довго так можна вимикати систему, до того моменту, поки вона зовсім не перестане вантажитися, але на жаль за два роки мені цього так і не вдалося зробити (можливо мені просто пощастило, не знаю ).

І на мій погляд, якщо такий режим підійшов для мого телевізора, то і для «простий Інтернет Радіо колонки» теж підійде, а тому що я примусово відключив автоматичне оновлення плагінів Kodi, то й ймовірність відмови файлової системи стане ще меншою. Поки що я проблеми з цим не бачу

Примітка:

    Но вы всегда при желании можете с помощью одной yocto команды 
    IMAGE_FEATURES += "read-only-rootfs"

    и определенной магии перевести ваш дистрибутив в режим "read only"
    

Дистрибутив «інтернет радіо колонки», що описується у статті, є побутовим, а що головне для побутового дистрибутива — це гарний GUI. На мій погляд дуже важко або майже неможливо навчити звичайного користувача вбивати якісь незрозумілі магічні команди в консолі, та він і слово такого не знає. А ось GUI, будь ласка.

І це, мабуть, мій головний аргумент на користь не консольного дистрибутива. Теплий ламповий графічний інтерфейс користувача Kodi, але він особливо не потрібний, але він є.
(Ще я зовсім забув згадати, що Kodi можна керувати дистанційно, наприклад зі смартфона, встановивши додаток «Yatse», і можливо для когось, це буде плюсом)

Конфігурація Kodi для керування мишею

а тепер Ракета

<keymap>
    <global>
        <mouse>
          <wheelup>VolumeUp</wheelup>
          <wheeldown>VolumeDown</wheeldown>
          <middleclick>ChannelDown</middleclick>
          <longclick id="0">ChannelDown</longclick>
          <longclick id="1">ChannelUp</longclick>
          <!-- конфигурационный rocket -->
        </mouse>
    </global>
</keymap>

Конфігурація перевизначає загальні (global) події для наступних елементів:

  • прокручування колеса миші вперед
  • прокручування колеса миші назад
  • натискання на середню кнопку миші
  • обробка тривалого натискання миші (3сек і більше),
    0 ідентифікатор правої кнопки; 1 ідентифікатор лівої кнопки

докладнішу інформацію щодо налаштування подій миші:

kodi.wiki/view/Alternative_keymaps_for_mice
kodi.wiki/view/Action_IDs
kodi.wiki/view/Window_IDs

Що робити, якщо кабельна система до вас не прийшла

"Але у мене вдома немає вільних Ethernet портів (або ніколи і не було)" - може вигукнути частина щасливих власників старих плат Raspberry Pi 1 (можливо плата купувалася для дослідження і так і залишилася лежати на шафі)

Оскільки на платі немає вбудованого Wifi, то без Ethernet підключення, вона дуже функціональна.

Звичайно, можливість використання плати Raspberry Pi 1 без Ethernet існує, але вимагатиме від вас певних зусиль. Зазвичай такі речі цікаво виконувати лише рамках вивчення чогось нового тобто. це не користувальницька робота.

Отже, розглянемо гіпотетичний варіант використання плати без Ethernet:

Можна підключити зовнішній USB - Wifi адаптер, керуючись тим міркуванням,
що адаптер повинен добре працювати під Linux

Примітка:

    К сожалению часть WiFi адаптеров работать не будет, 
    это не особенность представленного в данной статье дистрибутива, 
    а скорее проблема конкретных драйверов WiFi адаптеров в ядре Linux. 
    Можно констатировать тот факт, что в настоящий момент вы не можете просто 
    пойти в магазин и купить любой WiFi адаптер. Скорее вы должны подобрать WiFi 
    адаптер из списка менее проблематичных и хорошо работающих под Linux.

    я проверял только следующии модели:
    - WiFi адаптер на чипсете Atheros D-Link DWA-126 802.11n (AR9271)
    - WiFi адаптер NetGear WNDA3200
    - WiFi адаптер NetGear WNA1100
    - WiFi адаптер TP-Link TL-WN722N (AR9271)
    - WiFi адаптер TL-WN322G v3
    - WiFi адаптер TL-WN422G
    - Wifi адаптер Asus USB-N53 chipset Ralink RT3572 
    

Якщо у вас вже є usb Wifi адаптер, ви можете перевірити, чи добре він працює під Linux наступним чином:

  • Встановіть якийсь широко поширений Linux дистрибутив
    загального призначення, наприклад Ubuntu Desktop
  • Завантажте систему
  • Підключіть ваш Wifi USB адаптер
  • Запустіть мережевий менеджер, і спробуйте підключитися до точки доступу WiFi
  • Якщо все добре працює і ваше інтернет з'єднання стабільне, ваш адаптер добре підтримується і ви можете продовжити свою роботу з підключення цього адаптера в спеціалізованому дистрибутиві і можливо з іншими версіями ядра
    (якщо ні, то ні, на жаль, краще навіть і не намагатися)

Підтримка зовнішнього Wifi адаптера в Raspberry PI

Для коректної роботи WiFi адаптера в Linux: нам знадобиться дві речі:
1) Підтримка Linux ядром певного Wifi адаптера
2) Наявність у системі модуля ядра для певного Wifi адаптера

Візьмемо наприклад адаптер TP-Link TL-WN722N. У нього просто чудова антенка.
Знайдемо чіпсет, на якому плата працює — у мене це «AR9271», примітка:

    что самое интересное, это то, что для одной и той же модели
    одного и того же производителя, чипсет Wifi может отличаться.
    Я например сталкивался с тем, что для TL-WN722N версии 2, 
    используется уже другой чипсет Realtek RTL8188, а он уже 
    плохо работал под Linux (на тот момент), увы такие вот дела, 
    т.е. иногда нужно еще приглядываться к маленьким цифрам 
    версии на обратной (темной) стороне адаптера.    
    

Тепер знайдемо назву параметра в конфігурації ядра, що відповідає за драйвер чіпсету AR9271, найкраще пошукати поєднання слів «AR9271 cateee.net»
     де cateee.net — класний сайт з описом конфігурацій модулів ядра Linux

Відразу знаходимо назву конфігурації ядра. CONFIG_ATH9K_HTC
і назва потрібного нам модуля ядра ath9k_htc

і далі достатньо вказати назву потрібного модуля у файлі фрагмента конфігурації
Linux ядра => recipes-kernel/linux/files/rbpi.cfg, додайте рядок:
CONFIG_ATH9K_HTC=m

Таким чином надалі ви можете підключити будь-яке додаткове обладнання до вашої системи (якщо звичайно в Linux ядрі воно вже підтримується)

Що робити якщо ви хабра гік - конструктор

І створюєте круті речі, наприклад, такі як тут або ви студент і мрієте створити щось схоже.

То навскідку можна взяти який-небудь Touch Screen екран для RPI на aliexpress, там же замовити відповідну акумуляторну батарею, підключити все це до плати Raspberry Pi 1,2 або 3 (краще до 3, так як вона з вбудованим Wifi), вибрати тему оформлення графічного інтерфейсу в Kodi, розраховану на сенсорний екран і вуаля => у вас може вийти простий audio плеєр. Звичайно, він буде досить громіздкий, але він буде вашим.

  Примечание:
  A для того, чтобы собрать Мультимедиа центр Kodi для самой бюджетной платы 
  Raspberry Pi Zero Wifi в yocto вам достаточно изменить две строки:

  конфигурационный файл => build/conf/local.conf
      MACHINE = 'raspberrypi0-wifi'

  рецепт сборки Kodi  => recipes-mediacentre/kodi/kodi_17.bbappend
      EXTRA_OECONF_append = "${@bb.utils.contains('MACHINE', 
                            'raspberrypi0-wifi', '${BS_RPI}',  '', d)}"

  Якщо чуйність GUI Kodi 17.6 через одне процесорне ядро ​​в Zero вам здасться загадковою, то можна зробити фінт вухами і зібрати більш стару, але дуже швидку версію, наприклад Kodi 15.2, він у цьому плані більш "дружелюбний" (іноді legacy вирішує все)

На жаль, плати у мене немає, тому перевірити не можу, але за моїми відчуттями це має заробити.

Коротка інструкція зі збирання

    1) Установите зависимости Yocto Project (например в Ubuntu): 
    sudo apt-get install -y --no-install-suggests --no-install-recommends 
        gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential 
        chrpath socat cpio python python3 python3-pip python3-pexpect 
        xz-utils debianutils iputils-ping python3-git python3-jinja2 
        libegl1-mesa libsdl1.2-dev xterm

    2) Скачайте и установите Repo:
        mkdir ~/bin
        curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
        chmod a+x ~/bin/repo

    3) Загрузите проект с github:
        PATH=${PATH}:~/bin
        mkdir radio
        cd radio
        repo init -u https://github.com/berserktv/bs-manifest 
                  -m raspberry/rocko/radio-rpi-0.2.8.xml
        repo sync

    4) Соберите проект:
        ./shell.sh
        bitbake berserk-image
        
    можно тоже самое собрать для плат Raspberry Pi 3B Plus, 3B и 2B:
    repo init -u https://github.com/berserktv/bs-manifest 
              -m raspberry/rocko/radio-0.2.8.xml
    

докладнішу інструкцію зі складання
та записи на microSDHC карту див. в попередній статті

Постскриптум

Звичайно, ідея Інтернет радіо колонки типова, вона всім відома і на хабрі ви знайдете чимало статей з цього приводу, наприклад тут

І ще ви можете подумати, що я просто наздогнав вимоги до готового рішення. На це я можу парирувати і сказати, що ні, чесно.

Історія містера Ерві

    Хотите верьте, хотите нет, а дело было так:

    Наш рабочий офис граничит с фирмой по производству разного звукового
    оборудования, и однажды директор этой фирмы, назовем его мистер "Эрви"
    подошел к нашему заместителю директора филиала мистеру "Арсению"
    и спросил у него, насколько сложно повесить на плату Raspberry Pi 
    проигрывание звукового потока т.е. плата подключается к сети 
    и колонкам, и "слышен характерный звук".

    После этого мистер Арсений подошел к заместителю моего 
    начальника - мистеру "Борису" и переадресовал вопрос ему, 
    ну а я, как сторонний наблюдатель случайно эту идею запомнил
    и назвал ее "Задача трех начальников".

    В общем хотели как лучше, 
    а получилось, цитата - "Но мистер Эрви, как всегда, помог."

    Через некоторое время я поинтересовался у мистера "Бориса" 
    его мнением по поводу написания небольшой заметки на эту тему 
    на "Хабре", на что "Борис" ответил, что изменение 
    "трех пунктов меню" в Kodi, особо не привносит никакой 
    новой информации и не заслуживает отдельного упоминания. 
    Конечно я с ним полностью согласен и поэтому, я не расскажу ему, 
    что что-то написал по этому поводу.

    Статья написана исключительно для платы "Raspberry Pi 1" 
    взятой у мистера "Бориса" на время эксперимента, 
    совпадения со всеми другими платами "Raspberry Pi 1" случайны.
    

Побільше вам збірок хороших і різних, і нехай для вас цього року навіть колишня цегла співає.

Джерело: habr.com

Додати коментар або відгук