Как стать автором
Обновить

Простейшая интернет радио колонка «Kodi» или спасение «Малинового» кирпича

Open source **nix *Разработка на Raspberry Pi *Интернет вещей DIY или Сделай сам

Основные предпосылки:

  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\"^_^gtlt^_^/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\"^_^gtlt^_^/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=^_^quotquot^_^>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 карту см. в предыдущей статье


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

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

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

Побольше вам сборок хороших и разных.
Теги:
Хабы:
Всего голосов 15: ↑15 и ↓0 +15
Просмотры 11K
Комментарии Комментарии 4