Привет, Хабр! Меня зовут Кирилл, я руковожу направлением спецпроектов в МТС Диджитал, а в свободное время (кроме прочего) экспериментирую с техникой и гаджетами.

Лет пять назад мне довелось приобрести пару комплектов Xiaomi Mi Smart Sensor Set. На тот момент это было выгоднее, чем покупать шлюз и датчики отдельно. В итоге один из шлюзов стал центром умного дома, а второй отправился под эксперименты. На Хабре уже была статья, как можно перепрошить этот шлюз под открытую прошивку OpenLumi, состоящую из OpenWRT и веб-интерфейса LuCI. К тому же внутри OpenLumi можно было запустить сервер Home Assistant (HA) или Node-Red — и такая связка хорошо работала. 

Долгое время шлюз работал сервером мониторинга нужных мне интернет-ресурсов, моргая красной лампочкой каждый раз при обнаружении проблем с доступностью. Но недавно я решил, что пришла пора обновиться до актуальной версии OpenLumi и сделать из устройства интернет-радио. Что из этого получилось, рассказываю под катом.

Апдейт

Главное окно веб-интерфейса LuCI для OpenWRT
Главное окно веб-интерфейса LuCI для OpenWRT

Есть такое выражение: «‎Не было печали, апдейтов накачали». Это как раз про OpenLumi. Особенность девайса в том, что у него очень мало оперативной и постоянной памяти — по 256 Мб каждой. После апдейта попробовал накатить HA, и это даже получилось. Но первая же попытка установки дополнительных интеграций не увенчалась успехом — память кончилась. 

Стало ясно, что если и ставить на него HA, то сначала потребуется перепаять чип флеш-памяти, взяв его с какой-нибудь старой планки DDR2. Опять же железка слабовата для HA, хотя и имеет полный набор необходимых для него беспроводных интерфейсов. Так что временно решил превратить шлюз в интернет-радио, которое можно было бы воткнуть в розетку на кухне и слушать любимые интернет-радиостанции. 

Софт

Способов воспроизведения музыки на Linux достаточно много, но для OpenWRT проще всего выбрать приложение MPD (Music Player Daemon). Это кроссплатформенное приложение с клиент-серверной архитектурой, которое позволяет воспроизводить файлы с музыкой из определенной директории. Помимо этого, у MPD есть поддержка воспроизведения потокового аудио, что делает его идеальным вариантом для работы в качестве интернет-радиоприемника.

Чтобы командовать демоном MPD, существует много разных клиентов. Но для наших задач будет достаточно самого простого — MPC (Music Player Client). Это минималистичный CLI, позволяющий отдавать команды демону, например, на начало или остановку воспроизведения. Но перед тем как устанавливать и конфигурировать оба этих приложения, предлагаю взглянуть на конфигурацию звуковых устройств шлюза:

# aplay -l
**** List of PLAYBACK Hardware Devices **** 
card 0: tfa9882audio [tfa9882-audio], device 0: 2028000.sai-tfa9882-hifi tfa9882-hifi-0 [2028000.sai-tfa9882-hifi tfa9882-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Здесь мы имеем дело с ALSA. У нас доступна одна звуковая карта tfa9882audio. Откроем alsamixer и выставим громкость Master на средний уровень:

Теперь скачаем какой-нибудь тестовый звук:

# wget https://www2.cs.uic.edu/~i101/SoundFiles/StarWars60.wav

Попробуем его воспроизвести:

# aplay -D default StarWars60.wav
Playing WAVE 'StarWars60.wav' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

Из динамика шлюза зазвучала заглавная тема из «Звездных войн» — значит, ALSA функционирует правильно и можно приступать к установке MPD. Для начала обновим список пакетов:

# opkg update

Устанавливаем пакеты mpd-full и mpc:

# opkg install mpd-full mpc

Запускаем демона для проверки:

# mpd
server_socket: bind to '0.0.0.0:6600' failed (continuing anyway, because binding to '[::]:6600' succeeded): Failed to bind socket: Address in use
output: No 'audio_output' defined in config file
output: Successfully detected a alsa audio device

В соседней SSH-сессии вызываем клиент, пока без параметров:

# mpc
volume: n/a   repeat: off   random: off   single: off   consume: off

Соединение успешно, но пока что ничего не играет. Наша задача — воспроизводить потоковое интернет-радио, поэтому находим адрес потока (например, Comedy Radio) и добавляем его в плейлист mpd:

# mpc add https://pub0102.101.ru:8000/stream/air/aac/64/202

Запускаем воспроизведение:

# mpc play
https://pub0102.101.ru:8000/stream/air/aac/64/202
[playing] #1/1   0:00/0:00 (0%)
volume: n/a   repeat: off   random: off   single: off   consume: off

И вот наше интернет-радио уже звучит из динамика шлюза. Прибавить громкость можно или через alsamixer, или напрямую из mpc:

# mpc volume 100
MPD error: Failed to set mixer for 'default detected output'; no such mixer control: PCM

Упс! Кажется, автоопределение звуковой карты думает, что наш микшер называется PCM, а он в системе прописан как Master. Ставим для удобства редактирования конфигов текстовый редактор Nano:

# opkg install nano

Останавливаем воспроизведение:

# mpc stop

И в другой SSH-сессии останавливаем MPD через Ctrl + C. Открываем конфиг mpd на редактирование:

# nano /etc/mpd.conf

В разделе Audio Output раскомментируем секцию и приводим к виду:

audio_output {
        type            "alsa"
        name            "My ALSA Device"
        device          "hw:0,0"
        mixer_type      "software"
        mixer_device    "default"
        mixer_control   "Master"
        mixer_index     "0"
}

Сохраняем файл и выходим из редактора: Ctrl + X и Y на вопрос о сохранении изменений. Подтверждаем с помощью Enter. Запускаем mpd в одной сессии и воспроизведение с помощью mpc в другой сессии, предварительно выполнив команду очистки плейлиста и повторное добавление ссылки на поток:

# mpc clear
# mpc add https://pub0102.101.ru:8000/stream/air/aac/64/202
# mpc play

И вот теперь, когда мы вызываем изменение громкости через mpc, все отрабатывает корректно:

# mpc volume 100

Автозапуск

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

# /etc/init.d/mpd stop

Теперь отредактируем конфиг запуска mpd:

# nano /etc/init.d/mpd

Указываем, что демона надо запускать от рута, иначе тот не сможет получить доступа на открытие ALSA-устройства:

USER="root"
GROUP="root"

Сохраняем файл и выходим.

# nano /etc/rc.local

Вставляем до строчки exit 0 такое содержимое:

sleep 5
mpc clear
mpc volume 80
mpc add https://pub0102.101.ru:8000/stream/air/aac/64/202
mpc play

Сохраняем конфиг и выходим из редактора nano. Поскольку иногда система может не запустить поток, ссылаясь на то, что она не может зарезолвить домен, перед запуском мы поставили задержку sleep 5. Эта небольшая пауза помогает дождаться, пока сетевое соединение будет полностью установлено.

Теперь смело передергиваем шлюз по питанию — спустя 70 секунд автоматически включается Comedy Radio. Ровно то, что и требовалось.

Итоги

Наверняка читатель возмутится: от рута ничего запускать нельзя, это не секьюрно и вообще плохо. Если действовать по всем правилам, то нужно в обязательном порядке заводить отдельного пользователя. Потом заводить его в группу audio и давать права на специально выделенную директорию, где mpd будет хранить свое текущее состояние и сформированный плейлист, например. Но это выйдет сильно дольше. Вы потратите минимум пару часов, разбираясь с тем, на каком этапе у вас не хватает прав доступа и в каком конфиге что править.

Помимо mpc можно придумать много чего интересного. Например, есть клиенты MPD, поднимающие небольшой веб-сервер и позволяющие удобно управлять плейлистами и треками. В целом, можно легко смонтировать в систему сетевую шару и рулить воспроизведением с мобильного устройства. Но это уже совсем другая история.

Обязательно поделитесь в комментариях, стоит ли развить эту тему и рассказать про альтернативный вариант управления. Расскажите про собственный опыт работы с этим шлюзом: какие проекты вы пробовали реализовывать на этой железке и какой был результат?

Комментарии (7)


  1. infectedtrauma
    19.07.2024 13:24
    +4

    Hidden text


    1. radostnuy_glaz Автор
      19.07.2024 13:24
      +2

      Ну прикольно же! :)


      1. lenz1986
        19.07.2024 13:24
        +1

        5 лет почти прошло, а оно живее всех живых :))

        А в мтс вы случаем не связаны с умным домом ?)


        1. radostnuy_glaz Автор
          19.07.2024 13:24

          Только в свободное от работы время :)

          Вообще я больше про контент и коммуникации


      1. FirstEgo
        19.07.2024 13:24
        +3

        Действительно прикольно :)

        Хотя лет шесть-семь назад уже появился проект "Ka-radio", который позволяет собрать минимальный вайфай набор для прослушивания радио за шавуху. А если за букет пельменей с мазиком, то даже с экраном и энкодером.

        Тут соль в том, что на девайсе сабжа вполне неплохо могли бы развернуться гораздо более сочные проекты, пусть и с большим приложением усилий. Например, Wi-Fi диск/NAS, имхо, был бы интересней, поскольку из esp32 вайфай флешка получается ну прям в натяжечку тугенькая. А тут вполне пошустрее скорость будет.


  1. pistoletov
    19.07.2024 13:24
    +1

    Лет 5 назад так же делал но кажись на прошивке от падавана. Классная и удобная штука. Из минусов что стримы радиостанции которые закинул в плейлисты периодически меняются. Управляю через телефон приложением mpdroid


  1. vaslobas
    19.07.2024 13:24
    +1

    Занимался чем-то похожим.

    Только я взял роутер с поддержкой юсб. Перепрошил его в опенврт. Купил на алиэкспрессе юсб-звуковуху, добавил модули ядра для поддержки аудио и подключил колонки к роутеру. Установил https://github.com/mikebrady/shairport-sync и смог с макбука транслировать аудио на роутер. Было прикольно.