Передаем музыку по Bluetooth без проводов

Передаем музыку по Bluetooth без проводов Мультикоптеры

Aptx и aptx hd

aptX — простой и вычислительно быстрый кодек, без психоакустики, использующий адаптивную дифференциальную импульсно-кодовую модуляцию (

). Появился примерно в 1988 году (дата подачи

датирована февралём 1988 г.), до Bluetooth использовался преимущественно в профессиональной беспроводной аудиоаппаратуре,

ISDN

, кинотеатрах. На данный момент принадлежит компании Qualcomm, требует лицензирования и лицензионных отчислений. По состоянию на 2023 год: $6000 единовременно и ≈$1 за каждое устройство, для партий до 10000 устройств (

, стр. 16).

aptX и aptX HD — один и тот же кодек, с разными профилями кодирования.

У кодека есть только один параметр — выбор частоты дискретизации. Ещё есть, правда, выбор количества/режима каналов, но во всех известных мне устройствах (70 штук) поддерживается исключительно Stereo.

* Версии до 7 требуют модификации Bluetooth-стека. Кодек поддерживается, только если производитель Android-устройства лицензировал использование кодека у Qualcomm (если в ОС есть библиотеки кодирования).

aptX разделяет аудио на 4 частотных полосы и квантует их одним и тем же количеством бит постоянно: 8 бит для 0-5.5 кГц, 4 бита для 5.5-11 кГц, 2 бита для 11-16.5 кГц, 2 бита для 16.5-22 кГц (цифры для частоты дискретизации 44.1 кГц).

Пример aptX-аудио (вверху — исходный сигнал, внизу — aptX, спектрограммы только левых каналов, звук во FLAC):

Верхние частоты стали немного краснее, но разницы не слышно.

Из-за фиксированного распределения битов квантования, кодек не может «перенести биты» на те частоты, которые больше всего в них нуждаются. В отличие от SBC, aptX не будет «обрезать» частоты, а будет добавлять в них шумы квантования, уменьшая динамический диапазон аудио.

Не следует считать, что использование, например, 2 бит для полосы уменьшает динамический диапазон до 12 дБ: ADPCM позволяет использовать до 96 дБ динамического диапазона даже при использовании 2 бит квантования, но только при определенном сигнале.ADPCM хранит разницу числового представления между текущим и следующим отсчетом, вместо записи абсолютного значения, как в PCM.

Это позволяет уменьшить требования к количеству бит, необходимых для хранения такой же (без потерь) или практически такой же (с относительно небольшой ошибкой округления) информации. Для уменьшения ошибок округления применяются таблицы коэффициентов.

Из-за этого синтетические тесты всегда будут давать результат хуже, чем музыка. Я сделал специальный синтетический пример, на котором aptX показывает плохие результаты — синусоида частотой 12.4 кГц (вверху — исходный сигнал, внизу — aptX. Звук во FLAC. Уменьшите громкость!):

График спектра:

График спектра, максимальный уровень шумов — -55 dB

Отчетливо слышны шумы.

Однако, если сгенерировать синусоиду с меньшей амплитудой, чтобы она была тише, шумы также станут тише, что говорит о широком динамическом диапазоне:

Чтобы услышать разницу между оригинальным музыкальным треком и сжатым, можно инвертировать один из сигналов и сложить треки поканально. Такой подход, в общем случае, некорректен, и не давал бы вменяемого результата с более сложными кодеками, но конкретно для ADPCM вполне подходит.

Remote control (дистанционное управление компьютером через android)

Этой статьёй я (Tamir) открываю раздел Smart. В этой рубрике будут выходить статьи, посвящённые смартфонам, КПК, планшетам и другим портативными ЭВМкам.

Как вы уже поняли из названия статьи, речь сегодня пойдёт об удалённом управлении. Лет 5 назад я впервые натолкнулся на телефон, который обладал функцией управления компьютером через блютуз. В то время это показалось мне очень занимательным. Можно было, не вставая с кровати переключать фильмы, делать громче, тише, листать презентации.

Но время не стоит на месте, на дворе уже 2023 год. И не для кого ни секрет, что популярность приобрели умные гаджеты (смартфоны, КПК, планшетные компьютеры).

Просматривая Android маркет на предмет бесплатных и функциональных программ, я наткнулся на интересное приложение Unified Remote.

Программа поддерживает настройку соединения с компьютером по беспроводным сетям Wi-fi и Bluetooth в ручном и автоматическом режиме, имеет приятный, лаконичный интерфейс и незатейливое название.

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

Для бесплатной версии (на момент написания статьи — январь 2023 года) доступны следующие 14 пультов:

  • Basic Input – выполняет функцию удалённого тачпада
  • File Manager – позволяет вам просматривать содержимое вашего компьютера, а также открывать его.
  • Keyboard – виртуальная клавиатура
  • Media – универсальный пульт для медиа плееров
  • Navigation— поддерживает функции перемещения так, словно вы используете стрелки клавиатуры, Enter, backspace, escape, alt, tab.
  • Numpad – ввод чисел и знаков аналогичных расположенным на цифровой части компьютерной клавиатуры
  • Power – операции с питанием компьютера (Выключение, Перезагрузка, Гибернация)
  • Scroll Wheel – функции колёсика мыши
  • Slide Show – для управления мультимедийными презентациями.
  • Spotify — пульт управления сервисом Spotify
  • Start – позволяет вам получить доступ к программам, расположенным в меню «Пуск»-> «Все программы»
  • Task Manager – выводит на экран список выполняемых программ из диспетчера задач вашего компьютера.
  • VLC – пульт управления VLC плеером
  • Windows Media Center – пульт управления Windows Media Center
  • Windows Media Player – пульт управления Windows Media Player
  • You Tube – пульт управления You TUBE плеером

К сожалению, полный набор из 28 пультов и возможность создавать свои, доступны только в платной версии приложения (3.69$).

В настройках можно выставить несколько пультов для быстрого переключения между ними:

Preferences -> «Quick Switch»

В целом и общем Unified Remote – отличная бесплатная программа для дистанционного управления компьютером.

Беспроводной звук. часть 1. препарируем bluetooth

Передаем музыку по Bluetooth без проводов

Иногда, бывает, натыкаешься на какой-то баг впервые, списываешь все на обстоятельства и забываешь о нем. Затем он повторяется снова и снова, вынуждая тебя приступить к поиску проблем и, по возможности, их устранению. И вот когда ты обнаруживаешь себя в глубокой ночи за анализом дампом/дебагом/чтением_мануалов, то становится понятно, дело на полпути бросать уже нельзя и дело принципа — довести его до конца.

Такая история со мной приключилась в момент обзора с коллегой r3s потребительской беспроводной Bluetooth-акустики Klipsch KMC 3. Я столкнулся с ситуацией, когда «беспроводной» аудиопоток начинал безбожно прерываться, стоило лишь мне расположить источник звука у себя за спиной. Пищи для размышлений мне подкинула другая Bluetooth-аудиосистема, которая в тех же условиях вела себя куда лучше. Такая простая проблема выродилась в нырок с головой во внутренности протокола Bluetooth и детали передачи аудио с его помощью.

Под катом первой части цикла статей мы в легкой и непринужденной форме познакомимся с основными протоколами стека Bluetooth, покопаемся в дампе соединения источника и приемника звука, разберемся в причинах конфликта Bluetooth и Wi-Fi и обнаружим корень моей проблемы — прерывающегося звука.

Передаем музыку по Bluetooth без проводов Оставим за кадром (или перенесем в комментарии) полемику на тему “зачем нам беспроводная передача аудио, если можно обойтись православными проводными решениями, сэкономив кучу денег и выиграв в качестве”. Условимся, что беспроводной стриминг аудио с любых устройств, как портативных, так и не очень, нам интересен, ведь с ним мы можем:

  1. Проигрывать аудио с мобильных устройств (Google Music iTunes Match = вся медиатека в облаке и доступна с любого устройства) на беспроводные аудиосистемы и ресиверы. Не будем забывать, что именно телефоны сейчас завоевывают пальму первенства среди носителей музыкальных треков пользователей;
  2. Озвучивать пространства, в которых установка проводных решений по ряду причин затруднена (кухня, террасы, балконы, outdoor-зоны вашего загородного поместья);
  3. Позволять гостям “ставить их компакт-диск”;
  4. Забыть о кредлах, т.к. расставание с телефоном для многих становится мучительным процессом.

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

King Bluetooth
Передаем музыку по Bluetooth без проводовВиновница торжества — технология Bluetooth, получившая жизнь благодаря инициативе Ericsson в далеком 1994 году, затем стандартизованная IEEE (802.15-1) и по настоящее время развиваемая целой группой по интересам Bluetooth Special Interest Group (SIG). На текущий момент альянс Bluetooth SIG насчитывает порядка 18 000 компаний, среди которых, естественно, есть и те, кто занимается производством аудио компонентов, способных принимать без проводов стерео сигнал.

Недавно я обзавелся одним из таких устройств. Cистема Klipsch KMC 3, обзор которой есть на Хабре, удовлетворяла всем, кроме одного: при определенных условиях начинала воспроизводить звук, ужасно прерываясь. Юзкейс был следующим: в качестве источника аудиосигнала выступал Macbook Air 2023, и стоило расположить его за собственным телом в 4 метрах от системы (читай “сесть спиной к колонке с ноутбуком на коленях), как звук начинал прерываться. Второй участник Bluetooth-состязания (обзор которого вас ждет в конце поста) — Edifier Spinnaker E30, тоже страдал замиранием сигнала, но при этом в куда меньшей степени. Возник вопрос, в чем могла крыться причина столь разного поведения двух систем в одинаковых условиях?

Налицо проблема с распространением сигнала, но стоило в тех же условиях воспользоваться мобильным телефоном для воспроизведения аудио, как проблема становилась куда менее заметной. Так было решено разобраться в причинах и следствиях, что и привело меня к самым истокам — чтению Bluetooth Core Specification, анализу дампов сетевого соединения и модификации важных для аудиокодеков значений. Для начала, впрочем, требовалось исключить возможность интерференции между Bluetooth и Wi-Fi.

Одна кухня и несколько поваров
Не секрет, что и Bluetooth, и Wi-Fi (и еще множество систем) работают в одном диапазоне частот — ISM диапазоне — в границах 2.400 GHz — 2.4835 GHz. Использование одного частотного диапазона для передачи информации разных систем неминуемо приведет к интерференции сигналов, а значит — к потере данных. Именно на интерференцию сигналов Wi-Fi и Bluetooth я изначально и грешил.

Модуляция
Для эффективной передачи сигнала (цифрового, аналогового) посредством радио необходимо пройти процедуру модуляции. Позволим себе опустить тонкости различных процессов модуляции сигналов и сконцентрируемся на фактах, которые помогут представить картину спектра в среднестатистическом доме юзера наших дней.

Стандарт 802.11n (а я верю, что у 90% пользователей Хабра дома развернут именно он, хотя все нижеизложенное справедливо и для 11g) предусматривает использование OFDM модуляции сигнала с организацией 13 каналов шириной 20 МГц.

При этом стандартом 802.11b/g/n предусмотрено использование одного канала на протяжении всего времени работы, если его состояние считается удовлетворительным (читай “нет чередования каналов”).

Bluetooth же использует иной подход: в спектре ISM организуется 79 каналов шириной в 1 МГц, а затем по технологии расширения спектра Frequency-hopping Spread Spectrum (FHSS) радиоприемник и радиопередатчик синхронно меняют частоту несущей по определенному шаблону с частотой 1600 раз в секунду. Сделано это как раз для уменьшения вероятности наложения сигналов в крохотном ISM диапазоне.

Если бы у вас дома был спектральный анализатор, то процесс смены несущей по всему 2.4ГГц диапазону выглядел бы следующим образом:

Случайным образом разбросанные красные точки — это и есть сигнал Bluetooth, постоянно меняющий частоту. Зеленые области — это три активных канала Wi-Fi.

Борьба с интерференцией
Однако техника скоростной смены несущей не избавляет от интерференции, а всего лишь снижает вероятность ее возникновения. Шансы у Bluetooth-сигнала попасть в 20 МГц диапазон канала Wi-Fi по-прежнему ненулевые:

Поэтому в арсенале стека Bluetooth есть технология адаптивной смены частоты — Adaptive Frequency Hopping (

AFH

). Принцип работы AFH состоит в следующем: из 79 доступных 1 МГц каналов исключаются каналы, попадающие в занятый Wi-Fi сигналом диапазон:

На рисунке выше видно, как алгоритм AFH скорректировал карту доступных для “перескакивания” каналов, исключив те, что попали в уже занятый вайфаем 6-й канал.

Но мне не повезло, дело было не в интерференции сигнала, т.к. я перенес WLAN в “безопасный” для Bluetooth диапазон 5 ГГц (это, кстати, самый действенный метод для исключения возможных проблем), а прерывания аудио так никуда и не исчезли. Пришлось копать глубже.

Разбор дампа Bluetooth
Раз проблема была не в интерференции с Wi-Fi, то потребовалось более глубокое погружение в матчасть. Напомню, что интересным с точки зрения анализа был тот факт, что в одинаковых условиях две Bluetooth аудиосистемы (Klipsch KMC 3 и Edifier Spinnaker) вели себя по-разному. Klipsch захлебывался раньше, и для достижения эффекта нужно было просто заслонить телом прямой путь к колонке на расстоянии нескольких метров. Edifier же мог хрюкнуть пару раз, но после продолжал уверенно воспроизводить звук, изредка прерываясь.

Симптомы косвенно намекали на автоподстройку неких параметров со стороны Эдифаеров и отсутствие оной у Клипша при деградации качества радиосигнала. Чтобы проверить эту теорию, было решено снять дамп соединения двух устройств с целью поиска источника проблем.

Для чистоты эксперимента я выключил модуль Bluetooth, удалил из списка сопряженных устройств Klipsch, включил “синий зуб”, и, нажав кнопку записи дампа, прошел процедуру от поиска устройства и соединения с ним до передачи аудио.

Инициализация устройства
После активации Bluetooth-модуля, дамп наполняется записями сообщений HCI, которые в большинстве своем дают модулю понять, как его зовут, какой у него MAC адрес, к какому классу устройств он относится и включает непосредственно радио модуль.
Происходит это в форме диалога HCI Command -> HCI Event.

Стек блютуса лишь косвенно напоминает привычный TCP/IP, поэтому лицезрение дампа без предварительного прочтения спецификации не увенчалось успехом.

К чести группы Bluetooth SIG отмечу, что документация на корневую спецификацию и всевозможные профили находится в свободном доступе на

портале для разработчиков

, при этом написана простым и понятным языком.

Архитектура Bluetooth
Передаем музыку по Bluetooth без проводов Так моей настольной книгой на энное количество времени стала Bluetooth Core Specification. 13 мегабайтная пдф-ка о шести томах только сперва кажется необъятной, но для понимания базовых операций и принципов взаимодействия подсистем достаточно будет и нескольких глав.

Core System
В процессе поиска источника проблем я шел сверху вниз: встречая в дампе высокоуровневые протоколы, пытался понять логику их работы и назначение передаваемых параметров.
Безусловно, православный путь — снизу вверх: от азов установления физических и логических управляющих каналов Bluetooth к базирующимся на их основе высокоуровневым протоколам. Этим путем я вас и попробую провести.

Ядро блютуса — Bluetooth Core System Specification — описывает четыре базовых нижних уровня архитектуры и соответствующие протоколы, причем три нижних уровня, как правило, выделяют в отдельную подсистему — Bluetooth Controller, а все, что находится выше — относится к Bluetooth Host.

Структурная схема архитектуры Bluetooth Core System показывает расположение основных блоков архитектуры на уровнях модели, обозначает user-plane и control-plane трафик между блоками и, самое главное, дает представление об иерархичности стека.

На схеме не сделан акцент на очень важной части архитектуры — Host to Controller интерфейсе (HCI), обеспечивающем взаимодействие софтовой подсистемы Host с железной подсистемой Controller. Всё взаимодействие верхних уровней Bluetooth системы с ее аппаратной частью происходит через HCI-команды, инициируемые драйвером. Эти команды в дампе будут нам встречаться постоянно.

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

RF
Блок Radio (он же PHY), как и подобает резиденту физического уровня, занимается преобразованием битовой последовательности в радио сигналы. Вопросы модуляции, спектральных характеристик и физики процессов обеспечения битовой скорости — все это решается на нижнем уровне модели.

Baseband Layer = Link Controller Baseband Manager Device Manager
Уровень Baseband представлен в виде трех блоков, совместная задача которых состоит в управлении физическими каналами (Phy channels), поверх которых устанавливаются физические соединения (Phy links).  Bluetooth-адресация, синхронизации генераторов устройств, управление кодами доступа к физическим каналам, поиск устройств и установление физического канала между ними — все это задачи Baseband-уровня.

Link Manager
После того, как два нижних уровня обеспечили нас физическим соединением между master-slave устройствами, дело становится за организацией логических каналов, которые впоследствии и станут базой для передачи трафика приложений. Link Manager в ответе за установление, изменение и освобождение логических соединений между устройствами, а так же за обновление параметров физических соединений. Для этих целей Link Manager использует Link Management протокол (LMP).

L2CAP Layer = Channel Manager L2CAP Resource Manager
Переваливаемся в высокоуровневый блок Bluetooth Host, оккупированный L2CAP уровнем. Logical Link Control and Adaptation Protocol (L2CAP) — протокол, работающий поверх созданных логических соединений, обеспечивающий инкапсуляцию, сегментацию и восстановление пакетных данных от всех вышележащих приложений.

Транспортная архитектура
В процессе знакомства с блоками архитектуры у вас уже могла выстроиться картина общей транспортной архитектуры Bluetooth, которая представляет собой трехуровневую модель:

В дальнейшем в тексте я буду использовать слово “каналы” для обозначения Channels и “соединения” для Links.

На картинке выше представлен путь юникастного асинхронного трафика по транспортной архитектуре. Именно этот тип трафика характерен для передачи “пакетного” аудио.

SCO vs ACL
Если внимательно посмотреть на предыдущий рисунок, то на уровнях Logical Links и Logical Transports чаще всего встречаются аббревиатуры ACL и (e)SCO. Это два глобальных типа логических соединений между Bluetooth-устройствами, которые служат для передачи разного рода трафика вышестоящих приложений.

По ACL (Asynchronous Connection-Oriented Links) соединениям передается асинхронный, пакетный трафик с возможностью повторной отправки в случае потерь при доставке, сегментации и управления потоком.

SCO-соединения, в свою очередь, по сути организованы по принципу коммутации каналов с постоянной пропускной способностью 64кбит/с и синхронной передачей данных в тайм-слотах. SCO-каналы, например, используются профилем Headset для потоковой передачи голоса абонента от телефона к гарнитуре.
Согласно архитектуре Host Controller Interface, каждая его команда (HCI command) должна сопровождаться ответным событием (HCI Event). Ответ всегда возвращает статус команды (Success или код ошибки), а так же, опционально, запрошенные командой значения.

Ниже приведены три HCI команды на этапе самоинициализации модуля и события-ответы на них.

Поиск и обнаружение устройств

После того, как Bluetooth собрал информацию “о себе”, я запустил поиск устройств. Когда вы зажимаете кнопку до состояния мигающего индикатора, устройство переводится в режим прослушивания канала обнаружения (Inquiry Channel). Когда девайс услышит код доступа “ответьте все” на этом канале, он отправит информацию о своем присутствии.

Как и любой процесс обращения верхних уровней к железной части Bluetooth, все начинается с команды от HCI:

Здесь интерес представляет поле LAP. На самом деле это ни что иное, как аналог мультикаст адреса (general access code), увидев который на канале обнаружения, Bluetooth-устройства обязательно оповестят о своем присутствии ответным сообщением.

В итоге все девайсы, получившие general access code на своем физическом канале для обнаружения, отвечают сообщениями Inquiry Response, в которых:

указан MAC адрес устройства, его главный и второстепенные классы (Major Class и Minor Class), а также поддерживаемые сервисы.

Я выделил два параметра: первый — Sink — свидетельствует о том, что устройство может выступать в роли приемника аудиосигнала, а второй — Advanced Audio Distribution — что аппарат поддерживает тот самый A2DP-профиль.

Подключение
После процедуры поиска картина мира для Bluetooth-устройства становится ясна, самое время переходить к фазе подключения, или, как этот процесс называют в спецификации — Paging.

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

временного разделения каналов

(TDM). При таком подходе передатчик и приемник должны иметь синхронизированные тактовые генераторы, чтобы передавать и принимать информацию в нужные моменты времени.

Так как каждое Bluetooth-устройство оснащено своим собственным генератором, то ни о какой изначальной синхронизации между ними, естественно, речи не идет. Синхронизации добивается Link Controller в процессе установления соединения.
Происходит это следующим образом: в процессе поиска master-устройство получает от ответчиков среди прочих параметров еще и их значение тактового генератора. Затем, на этапе установления соединения master-устройство передает предполагаемое значение смещения тактового генератора для slave-устройства (параметр Clock Offset в скриншоте выше), тем самым ускоряя процесс синхронизации двух генераторов.

Самым важным полем команды Create Connection на подключение является идентификатор удаленного устройства — его Bluetooth-адрес (BD_ADDR). Вслед за командой контроллеру на установление соединения в бой вступает LMP протокол, который полностью управляет процессом организации логических соединений, поверх которых впоследствии будет гулять наш трафик:

Если помните, в начале статьи я рассказывал о методе Adaptive Frequency Hopping, позволяющем избежать интерференции на уже занятых частотах? Так вот, карта используемых частот как раз и передается в LMP сообщении Set AFH. В процессе работы я замечал новые появления данных пакетов с другой картой частот, что свидетельствует о постепенном мониторинге эфира на предмет страдающих от интерференции каналов.

Итогом процесса установления соединения станет присвоение связи двух Bluetooth устройств идентификатора Connection Handle.

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

Т.к. оба устройства поддерживают версию спецификации Bluetooth 3.0, то им доступен метод аутентификации Secure Simple Pairing (и его подметод Just Works), позволяющий аутентифицировать и авторизовать устройства без ввода каких-либо пин-кодов.

L2CAP in action
В главе, посвященной транспортной архитектуре, изображена схема иерархии каналов и соединений, на вершине которой находится L2CAP-протокол. Именно его очередь и наступает сразу после процессов аутентификации устройств.

Структурная схема архитектурных блоков L2CAP-уровня повествует о его возможностях по сегментации, повторной отправке, управлению потоками и ресурсами:

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

Для того, чтобы от процедуры спаривания устройств перейти к непосредственно информационному обмену, хорошо бы знать, а какие профили поддерживает сопряженное устройство, умеет ли оно воспроизводить аудио или орагнизовывать обмен файлами? На эти вопросы отвечает протокол Service Discovery (SDP). Так как это протокол верхнего уровня, ему не обойтись без услуг L2CAP-протокола, который специально для этого создаст канал. Давайте посмотрим, как это происходит.

В моем примере после успешного спаривания устройств появился первый L2CAP-пакет, содержащий следующие поля:

Команда Connection Request, как подсказывает КО, инициирует создание соединения с L2CAP уровнем slave-устройства, при этом в структуре пакета есть интересные для нас поля.

L2CAP протокол использует концепцию каналов, конечные точки такого канала в паре master-slave идентифицируются при помощи 2-байтного CID (Channel Identification). CID 0x0001 — зарезервированный идентификатор канала для терминирования трафика сигнализации L2CAP протокола, что логично, ведь именно к сообщениям сигнализации относится команда Connection Request (Channel ID: 0x0001 в нижней части скриншота).

Следующее важное поле — это PSM (Protocol/Service Multiplexer). Значение PSM говорит о том, для какого протокола или сервиса мы организовываем L2CAP канал и, как видите, речь идет о канале для Service Discovery Protocol.

Service Discovery
L2CAP хорошо потрудился и организовал канал для передачи данных протокола верхнего уровня SDP, который, как мы выяснили, поможет узнать, какие сервисы поддерживаются на удаленном устройстве.

Происходит это в форме следующего диалога:
— умеешь ли ты “_какой-нибудь сервис_”?
— да, умею, и вот его характеристики (в противном случае ответ “нет, не умею, спрашивай далее”).

На запросы всех сервисов, кроме Audio Sink и AV Remote Controller я получил негативный ответ, а значит колонка, что логично, умеет только воспроизводить аудио и давать управляющие сигналы мастер устройству (например при нажатии на кнопку pause на колонке, на паузу устанавливается проигрывание у источника).

После того, как SDP узнал о собеседнике все, что мог, самое время переходить к непосредственной передаче аудио, за которую отвечает…

Audio/Video Distribution Transport Protocol
За организацию и управление аудио/видео потоками отвечает именно этот парень. И в моем случае разобраться в логике его работы можно было, даже не погружаясь в 160-страничную спецификацию.

Диаграмма работы AVDTP довольно понятна. Чтобы запустить поток, требуется открыть два канала: один управляющий (signalling) и один, непосредственно, для передаваемых аудио/видео данных.

Как мы уже знаем, никуда не деться от L2CAP, именно по его каналам сверху будет идти трафик AVDTP-протокола.

L2CAP канал в этом случае открывается с новым значением PSM, соответствующим протоколу AVDTP.

Один L2CAP канал открылся для сообщений сигнализации, второй для данных AVDTP, а третий для Audio/Video Control Transport Protocol (для передачи сигналов от колонки к источнику звука) инициировала колонка.

Обратите внимание на пары Source CID/Destination CID, это точки входа для L2CAP-каналов. Пара Src/Dst CID однозначно определяет L2CAP-канал.

После установления нужных L2CAP-каналов запустился процесс обмена служебными сообщениями между AVDTP-протоколами на обеих сторонах соединения. Среди служебных сообщений стоит отметить:

Команда Discover позволяет узнать у удаленного устройства, а, собственно, что конкретно оно может предложить в рамках аудио/видео передачи. В ответ должно прийти описание возможностей в виде списка Service Endpoints (точек предоставления сервиса).

На первый взгляд непонятно, почему у колонки две точки в роли “приемник аудио”. На этот вопрос отвечает следующая пара сообщений:

Обратите внимание на пару значений Min Bitpool и Max Bitpool, вскоре они сыграют важную роль.

Так как Klipsch KMC3 умеет понимать два кодека — обязательный для A2DP-устройства SBC кодек и опциональный, проприетарный

AptX

кодек — то мы и видим две точки предоставления AVDTP-сервиса, они отличаются только типом поддерживаемого кодека, не более того.

AptX vs SBC
После получения сведений о возможностях сервисных точек AVDTP протокол сообщением Set Config выбирает работу с кодеком AptX.

Так было с Klipsch, но Edifier Spinnaker не поддерживает кодек AptX, поэтому его список сервисных точек состоял ровно из одной штуки с обязательным кодеком SBC (Low Complexity Subband Coding). В итоге дампы, снятые при установлении к двум системам, отличались лишь в выбранном кодеке передаваемого аудио!

Окей, но ведь AptX такой навороченный, платный, закрытый и пиарящийся на CeBITах, почему он, собака, начинает “замирать” в определенных условиях, и можно ли как-то заставить работать колонку Klipsch с SBC-кодеком, чтобы убедиться, что проблема именно в этом?

Для проверки я подключился к Edifier, повторил опыт с расположением ноутбука за своим телом во время записи дампа, и вот, что я увидел. Ниже представлен фрагмент AVDTP-протокола, содержащий в себе закодированный кодеком SBC фрагмент передаваемого аудио.

Т.к. SBC — кодек открытый, то в дампе можно увидеть относящуюся к нему информацию, связанную с передаваемыми аудиоданными. В  спецификации

A2DP

подробно описана работа SBC-кодека, откуда можно выяснить, что одним из ключевых параметров, влияющих в итоге на качество кодирования, является значение bitpool.

Из дампа видно, что значение bitpool для данной порции трафика равно 48, но стоило мне закрыть телом путь от ноутбука до колонки, как значение bitpool стало снижаться, сопровождаясь прерываниями и щелчками.

После того, как значение bitpool устаканилось на уровне 30, щелчки пропали, проигрывание аудио стало вновь непрерывным. Все указывало на то, что кодек выполнил автоподстройку, заметив деградацию качества сигнала.

Но неужели я своим бренным телом вносил такое существенное затухание? Что ж, время взглянуть на график индикации уровня мощности принимаемого сигнала:

Хорошее тело, качественно вносит затухание, о которое и спотыкаются кодеки. Вот только SBC-кодек подстроился под эти условия, снизив качество кодирования, а тем самым и необходимую пропускную способность, а AptX, по-видимому, нет.

Чтобы окончательно убедиться в том, что виноват AptX, я отключил его поддержку в Mac OS X и снова стал домогаться до Klipsch. Теперь был согласован кодек SBC между макбуком и колонкой, т.к. AptX’а ноутбук был принудительно лишен. Стоит ли говорить, что с SBC-кодеком Klipsch перестал так сильно заикаться в условиях падения уровня мощности сигнала?

Долго ли коротко, но проблема диагностирована, и ввиду закрытости AptX у меня не было никаких шансов повлиять на работу кодека (как это можно сделать с SBC, задав вилку значений bitpool в OS X). Поэтому осталось лишь не маячить телесами на пути видимого сигнала или использовать трюк с отключением кодека AptX в макоси.

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

PS1 Кстати, AptX не зря денег просит, передача аудио с его помощью через Bluetooth действительно лучше, чем с стандартным SBC. Это удалось почувствовать, отключив AptX на ноутбуке и прослушав те же треки на той же акустике. Субъективно — разница между SBC и AptX — примерно как между 192 kbps MP3 и 320 kbps — заметна, если вслушиваться.

Поддерживется AptX пока лишь узким кругом устройств, среди которых можно выделить железки под OS X и топовые смартфоны Samsung Galaxy, HTC One. Соответственно, iPhone и iPad в моем окружении именно по причине отсутствия AptX вели себя лучше, чем макбук, т.к. с ними согласовывалось использование SBC-кодека, а макбук лез с AptX.

PS2 На очереди препарация AirPlay.

PS3 И напоследок обзор Edifier Spinnaker, с которых вся эта эпопея длиною в месяц и началась.

Как я и писал во вступлении, этот пост изначально не должен был содержать ни одного скриншота, ни строчки о протоколах, но что-то пошло не так…

В комментариях к моему предыдущему

обзору Klipsch KMC 3

справедливо замечали, что $400 за пластиковую колонку в виде моноблока — это многовато. Спорить с этим бессмысленно, так как стоит на колонку повесить ярлык беспроводности, как ценник сразу же вырастает на добрую сотню-другую долларов. Но может и не стоит выкладывать $400 за моноблок от Клипша, в котором сам бренд, того гляди, добавил $50-100, а обратиться к продукции

менее именитых компаний

?

Поэтому когда коллега попросил помочь ему привезти из США приглянувшиеся ему Bluetooth-колонки, я не раздумывая согласился. Так, в качестве претендента на лавры рекомендуемой беспроводной аудио системы до $300, нам довелось рассмотреть продукт от компании Edifier — беспроводную стерео-систему Spinnaker E30.

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

Klipsch KMC 3

,

Creative ZiiSound

,

Bose SoundLink

,

Jawbone Jambox

,

Samsung DA-E670

и многими другими.

Передаем музыку по Bluetooth без проводов

При этом, несмотря на наличие именитых брендов в списке конкурентов, предрассудков относительно азиатских корней Edifier никто из нас не испытывал. Все-таки знак равенства между «сделано в Китае» и «г#%но» уже давно был перечёркнут хорошими продуктами в проводной сфере. Тем более, что с первого взгляда становится понятно, что с качеством сборки здесь все довольно хорошо.

Никакого жжения в области таза не возникало, даже когда мы поставили спинакеры рядом с “эталонным” B&W Zeppelin Air, собрано все добротно и на совесть. А собирать, как видите, там было чего — дизайн колонок по меньшей мере необычный.

Бивни, клыки, рога — какие только ассоциации ни возникали у гостей, но морские-то волки знают, что спинакер — это, на самом деле, один из парусов яхты. Сорокасантиметровые динамики,  обтянутые черной шелковой тканью, однозначно выглядят агрессивно, и в современный интерьер пара Spinnaker’ов должны вписаться как нельзя лучше.

Отдадим дань моде, пара слов о комплектации. После вскрытия многочисленных пакетов и коробок на столе оказался приличный ворох проводов, ведь в комплекте идут: соединительный шнур для связи между динамиками, оптический звуковой кабель, миниджек 3,5 мм, RCA кабель и пульт дистанционного управления со стандартным шнурком microUSB-USB к нему.

Честно говоря, подобное обилие проводов для, казалось бы, “беспроводных” колонок поначалу обескураживает, но на деле достаточно всего двух кабелей — питания и соединительного шнура 6-pin между динамиками. Остальные же кабели вам достаются в довесок и лишними в хозяйстве уж точно не будут.

Наличие mini-jack и оптического кабелей уже говорит о том, что колонки можно подключить к источнику воспроизведения старым-добрым проводным способом, для чего на коннекторной части правой колонки выделен порт Aux IN/Opt IN.

Внимательный читатель обратит внимание на порт Sub (Line) Out, предназначенный для подключения внешнего саба, который, если честно, был бы очень кстати паре парусов Spinnaker. Но “проводное” подключение скорее приятный бонус, нежели основное предназначение, которое лежит в беспроводной плоскости.

Процедура сопряжения по Bluetooth абсолютна стандартна: дожидаемся мигания синего диода на пике правого динамика и ждем пару секунд, пока процедура Secure Simple Pairing свяжет два устройства без ввода каких бы то ни было PIN-кодов.

Как только передача звука на внешнее устройство будет активирована, громкость станет изменяемой с помощью прилагаемого пульта, чья кнопка на верхнем торце играет роль Play/Pause свитчера, а долгий тап переключает источник ввода (bluetooth-line_in).

Пульт снабжен нескользящим покрытием базы и подсветкой, помогающей обнаружить его в условиях слабого освещения. К сожалению, подсветка своим уровнем яркости лишь отражает уровень заряда внутреннего аккумулятора, но не позволяет понять, в каком режиме источника звука (Bluetooth или Line In) находится аудиосистема.

Но что бы ни было с эргономикой и поведением пульта, самое главное в колонках все же звук. С этой точки зрения Spinnaker можно обозреть, как владельца трех излучателей в каждом динамике, включенных по схеме tri-amp!.. Но так пишут в

пресс-релизе

(весьма наполненном техническими деталями, кстати), мы же будем описывать субъективное восприятие качества воспроизведения, потому что описывать высокие аудиофильские материи в системе, выполненной из пластика, да еще и в “арт”-формате — дело сомнительное.

Общее впечатление от прослушивания композиций различных музыкальных направлений можно оценить по десятибальной шкале на 7 баллов. Пожалуй, не зря 3 пары излучателей в колонках снабжены собственными каналами от усилителя. С другой стороны, “кристальным”, как пишут в пресс-релизе, это звучание мы бы клеймить не стали.  

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

Отсутствие глубокого баса, как, например, у KMC 3 и Zeppelin Air, спишем на отсутствие крупногабаритного диффузора, которому просто не хватило места, принесенного в жертву богу дизайна. Самый крупногабаритный динамик, отвечающий за низкие частоты, направлен вниз и расположен у основания колонок.  Таким образом, “сабов” аж два, но их небольшой размер не заставит ваш пол вибрировать.
Впрочем, если у вас завалялся старый саб от любой другой системы, то попробуйте подключить его к спинакерам, такой симбиоз должен удовлетворить и вас, и ваших соседей.  

Сильная же сторона спинакеров, безусловно, в “не задавленных” средних частотах и общем звуковом балансе. Если у того же Klipsch KMC 3 кристальный звон верхних частот можно даже отнести к недостаткам, то здесь верха отчетливо слышны без назойливого выпячивания.   

Не будем забывать и о возможности разнесения стереопары. Все-таки стереозвучание у динамиков, живущих в одном корпусе, получается монофоническим при определенном удалении от них. Установив пару динамиков по разные стороны стола, мы получили весьма объемную звуковую картину, не мирясь с ощущением звука, исходящего из одной точки.

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

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

Ответом на вопрос “можно ли рекомендовать Spinnaker E30 в ценовом сегменте до $300?”, будет “да”, если вышеописанные минусы для вас не критичны. Товарищу эта система обошлась в амазоновские $279.99 $55 за доставку, в России же розничная цена на Spinnaker E30 колеблется в пределах 11-12 т.р.

Говоря о ближайших конкурентах, можно отметить комплект Creative ZiiSound D3x DSx, который выигрывает в низах за счет наличия полновесного саба, но в части верхних и середины чувствуется просадка. Top-shelf Bluetooth-акустика, разумеется, стоит дороже, и порой сильно дороже, так стоит ли переплачивать за бренд, когда можно получить достойное качество звука и запоминающийся внешний вид уже сейчас?

PS4 И, конечно, ничто не мешает похоливарить на тему “в печь беспроводные пластиковые поделки, 1) покупаем Airport Express, 2) полочную акустику 3) Profit.”

Передаем музыку по bluetooth без проводов

Как принимать музыку по Bluetooth на ваше устройство, я поделюсь информацией…

Приобрел модуль под названием XS-3868. Делюсь с читателями информацией. Это встраиваемый модуль с чипом OVC3860, предназначенный для организации передачи данных и звука по Bluetooth протоколу.

Модуль по габаритом достаточно мелкий 16х29 мм.

Кроме простого воспроизведения музыки, сам модуль может управлять некоторыми функциями телефона и плеера при воспроизведении — переключать/останавливать/запускать треки, изменять громкость. Достаточно допаять нужные кнопки к модулю.

Передаем музыку по Bluetooth без проводов

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

схема подключения

Передаем музыку по Bluetooth без проводов

Передаем музыку по Bluetooth без проводов
Передаем музыку по Bluetooth без проводов

используем усилитель из предыдущего обзора radiocopter.ru/blog/ebay/23671.html
Передаем музыку по Bluetooth без проводов

запитал это все на столе от 3.7v., подрубил на вход усилителя, телефон нашел новое устройство, попросил код 0000, и сконекктился ( один телефон попросил код, второй подсоединился без кода),
звук как в проводных наушниках, уровень громкости по умолчанию на максимуме, уменьшить можно удерживая соответствующий контакт на — более 2 сек. Ловит сигнал примерно на расстоянии 10 метров.

подключаем к компьютеру такой модуль
Передаем музыку по Bluetooth без проводов
соединяемся с устройством (драйвер установился автоматически Windows 7 x64) и передаем звук
Передаем музыку по Bluetooth без проводов
можно подключить к нему аккумулятор и зарядку
Передаем музыку по Bluetooth без проводовПередаем музыку по Bluetooth без проводов
Если модуль ни к чему не подключен, то через пять минут он уходит в режим энергосбережения (отключается) и чтобы снова вывести его в рабочий режим нужно его сбросить или передернуть питание.
Модуль можно встроить прямо в колонки. Использовать для подключения наушников, встроить в автомагнитолу в машину или куда еще хотите. Главное организовать питание в диапазоне 3,6 — 4,2 вольта.
Смотрим видео youtu.be/Npds03qkv6c

кто хочет, может сразу приобрести готовое устройство в корпусе и аккумулятором, вот ссылка ebay.com/itm/360679592835

Update Кстати я не стал описывать второй модуль, вы можете также использовать модуль
BLK-MD-SPK-B, который чуть меньше размером, но функции практически одинаковые
Передаем музыку по Bluetooth без проводов
Передаем музыку по Bluetooth без проводов
ссылка на ebay ebay.com/itm/360751412602:MEWNX:IT&_trksid=p3984.m1439.l2649

Передача данных через bluetooth

В Bluetooth существует два типа передачи данных: Asynchronous Connection Less (ACL) для асинхронной передачи без установки соединения, и Synchronous Connection Oriented (SCO), для синхронной передачи с предварительным согласованием соединения.

Передача осуществляется с использованием схемы разделения времени и выбора канала передачи на каждый пакет отдельно (Frequency-Hop/Time-Division-Duplex, FH/TDD), для чего время делится на 625-микросекундные интервалы, называемые слотами (slot). Одно из устройств ведет передачу в чётных номерах слотов, другое — в нечётных.

Передаваемый пакет может занимать 1, 3 или 5 слотов, в зависимости от размера данных и установленного типа передачи, в этом случае передача одним устройством ведётся в чётных и нечетных слотах до конца передачи. Всего в секунду можно принять и отправить до 1600 пакетов, если каждый из них занимает 1 слот, и оба устройства без остановки что-то передают и принимают.

2 и 3 мбит/с для EDR, которые можно встретить в анонсах и на сайте Bluetooth, являются максимальной канальной скоростью передачи всех данных суммарно (включая технические заголовки всех протоколов, в которые нужно инкапсулировать данные), в двух направлениях одновременно. Фактическая скорость передачи данных будет сильно отличаться.

Для передачи музыки используется асинхронный способ, почти всегда с помощью пакетов типа 2-DH5 и 3-DH5, которые несут максимальное количество данных в режиме EDR 2 мбит/с и 3 мбит/с соответственно, и занимают 5 слотов временного разделения эфира.

Схематичное представление передачи с использованием 5 слотов одним устройством и 1 слота другим (DH5/DH1):
5 слотов на передачу, каждый из которых передаётся 625 микросекунд, и один слот на приём, тоже 625 микросекунд. В сумме — 3.75 миллисекунды.

Из-за принципа разделения эфира по времени мы вынуждены ждать 625-микросекундный тайм-слот после передачи пакета, если второе устройство нам ничего не будет передавать или передает маленький пакет, и большее количество времени, если второе устройство ведёт передачу большими пакетами.

Необходимость инкапсуляции аудио в специальные транспортные протоколы L2CAP и AVDTP забирает 16 байт от возможного максимального количества передаваемой полезной аудионагрузки.

1414 и 1429 кбит/с точно недостаточно для передачи несжатого звука в реальных условиях, с зашумленным диапазоном 2.4 ГГц и необходимостью передачи служебных данных. EDR 3 мбит/с требователен к мощности передачи и шумам в эфире, поэтому, даже в режиме 3-DH5, комфортная передача PCM невозможна, постоянно будут кратковременные прерывания, и всё будет работать только на расстоянии в пару метров.


На практике, даже 990 кбит/с-аудиопоток (LDAC 990 kbit/s) передаётся с трудом.

Вернёмся к кодекам.

Поддержка кодеков аудиоустройствами

Не все производители публикуют точную информацию о кодеках, которые поддерживают те или иные беспроводные наушники, колонки, ресиверы или трансмиттеры. Иногда бывает так, что поддержка определённого кодека есть только на передачу, но не на приём (актуально для комбинированных трансмиттеров-ресиверов), хотя производитель заявляет просто о «поддержке», без примечаний (предполагаю, в этом виновато раздельное лицензирование энкодеров и декодеров некоторых кодеков). В самых дешевых устройствах можно вовсе не обнаружить заявленную поддержку aptX.

К сожалению, в интерфейсах большинства ОС нигде не отображается используемый кодек. Информация об этом есть только в Android, начиная с 8 версии, и macOS. Однако, даже в этих ОС будут отображаться только те кодеки, которые поддерживает как телефон/компьютер, так и наушники.

Как же узнать, какие кодеки поддерживает устройство? Самый надежный вариант — записать и проанализировать дамп трафика с параметрами согласования A2DP!Сделать это можно в Linux, macOS и Android. В Linux можно воспользоваться Wireshark или hcidump, в macOS — Bluetooth Explorer, а в Android — штатной функцией сохранения Bluetooth HCI-дампа, которая доступна в инструментах разработчика.

Вы получите дамп в формате btsnoop, который можно загрузить в анализатор Wireshark.Обратите внимание: корректный дамп можно получить только подключившись с телефона/компьютера к наушникам/колонке (как бы курьёзно это ни звучало)! Наушники могут самостоятельно устанавливать соединение с телефоном, и в этом случае они будут запрашивать список кодеков у телефона, а не наоборот.

Используйте следующий фильтр отображения, чтобы отсеять нерелевантный трафик:

btavdtp.signal_id

В результате вы должны увидеть что-то похожее:
Wireshark с загруженным дампом и фильтром для отображения A2DP-команды GetCapabilitiesНа каждом пункте команды GetCapabilities можно нажать, и посмотреть подробные характеристики кодека.
Характеристики одного из выбранных пунктов. Виден идентификатор кодека.

Wireshark знает не все идентификаторы кодеков, поэтому часть кодеков придётся расшифровывать вручную, смотря в таблицу идентификаторов ниже:

Mandatory:
0x00 - SBC

Optional:
0x01 - MPEG-1,2 (aka MP3)
0x02 - MPEG-2,4 (aka AAC)
0x04 - ATRAC

Vendor specific:
0xFF 0x004F 0x01   - aptX
0xFF 0x00D7 0x24   - aptX HD
0xFF 0x000A 0x02   - aptX Low Latency
0xFF 0x00D7 0x02   - aptX Low Latency
0xFF 0x000A 0x01   - FastStream
0xFF 0x012D 0xAA   - LDAC
0xFF 0x0075 0x0102 - Samsung HD
0xFF 0x0075 0x0103 - Samsung Scalable Codec
0xFF 0x053A 0x484C - Savitech LHDC

0xFF 0x000A 0x0104 - The CSR True Wireless Stereo v3 Codec ID for AAC
0xFF 0x000A 0x0105 - The CSR True Wireless Stereo v3 Codec ID for MP3
0xFF 0x000A 0x0106 - The CSR True Wireless Stereo v3 Codec ID for aptX

Узнать, поддерживает ли ваше устройство скорости передачи EDR 3 мбит/с, можно фильтром:

bthci_evt.code==0x0b

image

Устранение неполадок

Для того чтобы проверить наличие радиосигнала, для начала следует убедиться, что устройство поддерживает функцию FM-приемника. Необходимо открыть инструкцию по руководству к девайсу. Как правило, наличие приемника описывается в характеристиках.

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

Использование неисправного USB-провода в качестве антенны тоже может быть причиной возникновения неполадок с FM-радио. Различные загибы и перегибы на шнуре могут препятствовать приему сигнала.

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

Если проблема возникла с подключением Bluetooth-колонки к телефону, то необходимо удостовериться, что на обоих устройствах активирован режим Bluetooth.

Некоторые модели колонок имеют слабый сигнал беспроводного подключения. Поэтому при подключении через Bluetooth нужно расположить оба устройства на минимальном расстоянии друг от друга. Если колонка по-прежнему не работает, то можно сбросить её настройки.

При подключении колонки к телефону возможна потеря звука. Чтобы устранить неполадку, требуется зайти в меню телефона и открыть настройки Bluetooth. Затем необходимо нажать на название подключенного девайса и выбрать пункт «Забыть это устройство». После этого нужно заново начать поиск устройств и подключиться к колонке.

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

Как настроить радио на колонке – подробнее в видео.

Смотрите про коптеры:  Android и Arduino: основы взаимодействия смартфонов и платы
Оцените статью
Радиокоптер.ру
Добавить комментарий