Простейшая интернет радио колонка «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\"^_^gt�lt^_^/startlast>"
    R1_LINE = "<startlast^_^gtlt^_^/startlast>"
    # конфигурация вывода звука, всегда подключен только аналоговый аудио выход
    F2_LINE = "<audiodevice default=\"true\">PI:HDMI</audiodevice>"
    R2_LINE = "<audiodevice>PI:Analogue</audiodevice>"
    # так как HDMI по умолчанию не используется отключаю автоматическое обновление
    # а то может получиться что питание уехало, а данные остались не записанными
    F3_LINE = "<addonupdates default=\"true\"^_^gt�lt^_^/addonupdates>"
    R3_LINE = "<addonupdates^_^gtlt^_^/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=^_^quot�quot^_^>ChannelDown</longclick>
              <longclick id=^_^quotquot^_^>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 карту см. в предыдущей статье


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

    Конечно идея Интернет радио колонки типовая, она всем известна и на хабре вы найдете немало статей по этому поводу, например здесь

    И еще вы можете подумать, что я просто подогнал требования к готовому решению. На это я могу парировать и сказать, что нет, честно честно.

    Побольше вам сборок хороших и разных.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 4

      0

      Спасибо! Отличная статья, мне кажется только картинок сильно не хватает.

        0

        Если Вам нужно сделать из RPi интернет-аудио-проигрыватель, то Kodi — это полный overkill.
        Откройте для себя Volumio, RuneAudio и подобные проекты.

          0
          Согласен, но ведь плата пять лет на шкафу, ее не жалко
          и на мой взгляд, если начинать с самого тяжелого решения
          по производительности, то все остальные покажутся очень
          даже ничего, а для RPI3, у вас уже общая загрузка процессора
          15 — 20%, что в принципе приемлемо.
          0
          На Хабре как-то был перевод статьи
          mightyohm.com/blog/2009/05/building-a-wifi-radio-part-10-building-the-box
          о том как сделать действительно Wi-Fi радио.
          image

          На RPi можно добавить функционала больше. Тот же экран заменить на графический.
          image

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое