Простейшая интернет радио колонка «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 project
и возможность продолжить в том же ключе, пересилила мой исследовательский порыв. Об этом в следующей главе.

Превращение 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" случайны.     

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


ссылка на оригинал статьи https://habr.com/ru/post/482714/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *