Поддержка слуховых аппаратов с Bluetooth LE

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

При разработке CoC использовалась основная спецификация Bluetooth (BT) версии 6.0. Чтобы не нарушать основные спецификации, все многобайтовые значения на этой странице должны считываться в формате с прямым порядком байтов.

Терминология

центральный
Устройство Android, которое сканирует объявления по Bluetooth.
периферийное устройство
Слуховой аппарат, который отправляет рекламные пакеты по Bluetooth.

Топология сети и архитектура системы

При использовании CoC для слуховых аппаратов топология сети предполагает наличие одного центрального устройства и двух периферийных устройств (левого и правого), как показано на рисунке 1. Аудиосистема Bluetooth рассматривает левое и правое периферийные устройства как один аудиоприемник. Если одно из устройств отсутствует (например, из-за монофонического режима или потери связи), центральное устройство смешивает левый и правый аудиоканалы и передает звук на оставшееся устройство. Если центральное устройство теряет связь с обоими периферийными устройствами, то оно считает, что связь с аудиоприемником потеряна. В таких случаях центральное устройство перенаправляет аудио на другой выход.

Диаграмма, на которой показано устройство Android, подключенное по Bluetooth LE к двум слуховым аппаратам (левому и правому).
Рисунок 1. Топология для подключения слуховых аппаратов к мобильным устройствам Android с помощью CoC через BLE.

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

При подключении слуховых аппаратов центральное устройство должно:

  • Отслеживать последние подключенные левые и правые периферийные устройства.
  • Если подключение установлено, считайте, что периферийные устройства используются. Центральное устройство должно пытаться подключиться или повторно подключиться к сопряженному устройству при потере соединения.
  • Если подключение удалено, периферийные устройства считаются неиспользуемыми.

В приведенных выше случаях создание пары относится к регистрации набора слуховых аппаратов с определенным UUID и обозначениями левого и правого аппаратов в ОС, а не к процессу подключения по Bluetooth.

Системные требования

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

  • Используйте контроллер, соответствующий стандарту BT 4.2 или более поздней версии. Мы настоятельно рекомендуем использовать безопасные подключения LE.
  • Поддерживает не менее двух одновременных LE-подключений к центральному устройству с параметрами, описанными в разделе Формат и временные характеристики аудиопакетов.
  • Поддержка хотя бы одной ссылки LE на периферийном устройстве с параметрами, описанными в разделе Формат и временные характеристики аудиопакета.
  • Поддержка управления потоком на основе кредита LE [BT Vol 3, Part A, Sec 10.1]. Устройства должны поддерживать размер MTU и MPS не менее 167 байт на CoC и буферизацию до восьми пакетов.
  • Поддержка расширения длины данных LE [BT Vol 6, Part B, Sec 5.1.9] с полезной нагрузкой не менее 167 байт.
  • Убедитесь, что центральное устройство поддерживает команду HCI LE Connection Update Command и соответствует ненулевым параметрам maximum_CE_Length и minimum_CE_Length.
  • Поддерживать пропускную способность данных на центральном устройстве для двух подключений LE CoC к двум разным периферийным устройствам с интервалами подключения и размерами полезной нагрузки, указанными в разделе Формат и временные характеристики аудиопакетов.
  • Установите для параметров MaxRxOctets и MaxRxTime в кадрах LL_LENGTH_REQ или LL_LENGTH_RSP на периферийном устройстве минимально необходимые значения, соответствующие этим спецификациям. Это позволяет центральному процессору оптимизировать планировщик времени при расчете времени, необходимого для получения кадра.

Настоятельно рекомендуем, чтобы центральное и периферийное устройства поддерживали 2M PHY, как указано в спецификации BT 5.0. Центральное устройство должно поддерживать аудиосвязь со скоростью не менее 64 Кбит/с на физическом уровне 1M и 2M. Нельзя использовать PHY BLE с большим радиусом действия.

CoC использует стандартные механизмы Bluetooth для шифрования на уровне канала связи и переключения частоты.

Сервисы GATT ASHA

Периферийное устройство должно реализовывать сервис GATT-сервера Audio Streaming for Hearing Aid (ASHA), описанный ниже. Периферийное устройство должно рекламировать этот сервис, когда оно находится в режиме обнаружения, чтобы центральное устройство могло распознать аудиоприемник. Все операции потоковой передачи аудио LE должны требовать шифрования. Потоковая передача аудио по Bluetooth Low Energy имеет следующие характеристики:

Характеристика Свойства Описание
ReadOnlyProperties Прочитано Подробнее ReadOnlyProperties…
AudioControlPoint Писать и не получать ответа Контрольная точка для аудиопотока. Подробнее: AudioControlPoint.
AudioStatusPoint Чтение/уведомления Поле отчета о статусе для контрольной точки аудио. Подробнее: AudioStatusPoint.
Volume Написать без ответа Байт в диапазоне от -128 до 0, указывающий величину ослабления, применяемого к потоковому аудиосигналу, в диапазоне от -48 до 0 дБ. Значение -128 должно интерпретироваться как полное отключение звука.Самый низкий уровень громкости, при котором звук не отключается, – это -127, что соответствует ослаблению на 47,625 дБ. При значении 0 синусоидальный сигнал, передаваемый от шины до шины, должен соответствовать входному сигналу 100 дБ УЗД на слуховом аппарате. Центральное устройство должно передавать поток в номинальном полном масштабе и использовать эту переменную, чтобы задать желаемый уровень представления на периферийном устройстве.
LE_PSM_OUT Прочитано PSM, который будет использоваться для подключения аудиоканала. из динамического диапазона [BT Vol 3, Part A, Sec 4.22].

В таблицах ниже описаны UUID, назначенные сервису, и их характеристики.

UUID сервиса: {0xFDF0}

Характеристика UUID
ReadOnlyProperties {6333651e-c481-4a3e-9169-7c902aad37bb}
AudioControlPoint {f0d4de7e-4a88-476c-9d9f-1937b0996cc0}
AudioStatus {38663f1a-e711-4cac-b641-326b56404837}
Volume {00e4ca9e-ab14-41e4-8823-f9e70c7e91df}
LE_PSM_OUT {2d410339-82b6-42aa-b34e-e2e01df8cc1a}

Помимо сервиса ASHA GATT, периферийное устройство должно также реализовать сервис информации об устройстве, чтобы центральное устройство могло определять названия производителей и устройств.

ReadOnlyProperties

ReadOnlyProperties имеет следующие значения:

Байт Описание
0 Версия – должно быть 0x01
1 Подробнее DeviceCapabilities…
2-9 Подробнее HiSyncId…
10 Подробнее FeatureMap…
11-12 RenderDelay. Время в миллисекундах от момента, когда периферийное устройство получает аудиокадр, до момента, когда оно воспроизводит звук. Эти байты можно использовать, чтобы задержать видео и синхронизировать его со звуком.
13-14 Зарезервировано для использования в будущем. Инициализировать нулями.
15-16 Поддерживаемые идентификаторы кодеков. Это битовая маска поддерживаемых идентификаторов кодеков. Единица в определенной позиции бита означает, что кодек поддерживается. Например, значение 0x0002 указывает на то, что поддерживается кодек G.722 с частотой 16 кГц. Остальные биты должны быть равны 0.

DeviceCapabilities

Бит Описание
0 Сторона устройства (0 – левая, 1 – правая)
1 Указывает, является ли устройство отдельным и получает ли оно моноданные, или же устройство входит в комплект (0 – моно, 1 – бинауральный).
2 Устройство поддерживает CSIS (0 – нет, 1 – да).
3-7 Зарезервировано (задано значение 0)

HiSyncId

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

Байт Описание
0-1 Идентификатор производителя. Это идентификатор компании, назначенный BTSIG.
2-7 Уникальный идентификатор набора слуховых аппаратов. Идентификатор должен быть одинаковым для левого и правого периферийного устройства.

FeatureMap

Бит Описание
0 Поддерживается ли потоковая передача аудио с использованием LE CoC (да/нет).
1-7 Зарезервировано (установлено значение 0).

Идентификаторы кодеков

Если бит установлен, то кодек поддерживается.

Идентификатор/номер бита Кодек и частота дискретизации Требуемый битрейт Время формирования кадра Обязательно для центральных (C) или периферийных (P) устройств
0 Зарезервировано Зарезервировано Зарезервировано Зарезервировано
1 G.722, 16 кГц 64 кбит/с Переменная C и P
Значения от 2 до 15 зарезервированы.

AudioControlPoint

Эту точку управления нельзя использовать, когда закрыт сертификат соответствия требованиям законодательства. Инструкции приведены в разделе Как начать и остановить аудиопоток.

Код операции Аргументы Подпроцедура GATT Описание
1 «Start»
  • uint8_t codec
  • uint8_t audiotype
  • int8_t volume
  • int8_t otherstate
Запись с ответом и дополнительное уведомление о статусе с помощью характеристики AudioStatusPoint. Указывает периферийному устройству сбросить кодек и начать воспроизведение кадра 0. Поле codec указывает идентификатор кодека, который нужно использовать для воспроизведения. Например, для G.722 на частоте 16 кГц поле codec имеет значение `1`.

Битовое поле типа аудио указывает типы аудио, присутствующие в потоке:
  • 0 – неизвестно.
  • 1 – рингтон;
  • 2 – телефонный звонок.
  • 3 – медиаконтент.
Поле otherstate указывает, подключена ли вторая сторона бинауральных устройств. Значение поля равно 1, если подключено другое периферийное устройство, и 0, если нет.

Периферийное устройство не должно запрашивать обновление подключения до получения кода операции «Stop».
2 «Stop» Нет Запись с ответом и ожидание дополнительного уведомления о статусе с использованием характеристики AudioStatusPoint. Указывает периферийному устройству прекратить воспроизведение аудио. Чтобы возобновить воспроизведение, необходимо заново запустить последовательность настройки аудио.
3 «Status»
  • uint8_t connected
Запись без ответа Сообщает подключенному периферийному устройству об изменении статуса другого периферийного устройства. Поле connected указывает на тип обновления:
  • 0 – другое периферийное устройство отключено.
  • 1 – подключено другое периферийное устройство
  • 2 – обновление параметров подключения LE произошло в одном из подключений.

AudioStatusPoint

Поле отчета о статусе для контрольной точки аудио

Коды операций Описание
0 Статус: ОК
-1 Неизвестная команда
-2 Недопустимые параметры

Реклама сервиса ASHA GATT

UUID сервиса должен быть в пакете рекламы. В объявлении или ответе на сканирование периферийные устройства должны иметь тип данных службы:

Смещение в байтах Название Описание
0 Длина аудиодескрипции >= 0x09
1 Тип объявления 0x16 (данные сервиса – 16-битный UUID)
2–3 UUID сервиса 0xFDF0 (little-endian)

Примечание. Это временный идентификатор.
4 Версия протокола 0x01
5 Возможности
  • 0 – левая (0) или правая (1) сторона.
  • 1 – одно (0) или два (1) устройства.
  • 2 – устройство поддерживает CSIS (<0: не поддерживается, 1: поддерживается)
  • 3–7 – зарезервировано. Эти биты должны быть нулевыми.
6-9 Обрезано: HiSyncId Четыре наиболее значимых байта HiSyncId. Эти байты должны быть самой случайной частью идентификатора.

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

Если периферийные устройства помещают название и данные сервиса ASHA в один и тот же тип фрейма (ADV или SCAN RESP), то два типа данных ("Полное локальное название" и "Данные сервиса ASHA") должны появляться в одном фрейме. Это позволяет сканеру мобильного устройства получать оба типа данных в одном результате сканирования.

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

Синхронизация левого и правого периферийных устройств

Чтобы работать с Bluetooth на мобильных устройствах Android, периферийные устройства должны быть синхронизированы. Воспроизведение на левом и правом периферийных устройствах должно быть синхронизировано по времени. Оба периферийных устройства должны одновременно воспроизводить аудиосэмплы из источника.

Периферийные устройства могут синхронизировать время, используя порядковый номер, который добавляется к каждому пакету аудиоданных. Центральное устройство гарантирует, что аудиопакеты, которые должны воспроизводиться одновременно на каждом периферийном устройстве, имеют одинаковый порядковый номер. Порядковый номер увеличивается на единицу после каждого аудиопакета. Каждый порядковый номер имеет длину 8 бит, поэтому порядковые номера повторяются после 256 аудиопакетов. Поскольку размер каждого аудиопакета и частота дискретизации фиксированы для каждого подключения, два периферийных устройства могут определить относительное время воспроизведения. Подробнее о формате аудиопакета и временных метках…

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

  • В рамках команды «Start» AudioControlPoint передается текущее состояние подключения другой стороны бинауральных устройств.
  • При подключении, отключении или обновлении параметров подключения одного периферийного устройства команда «Status» из AudioControlPoint отправляется на другое устройство из пары.

Формат и время передачи аудиопакетов

Упаковка аудиокадров (блоков сэмплов) в пакеты позволяет слуховому аппарату определять время по временным якорям уровня связи. Чтобы упростить реализацию:

  • Аудиокадр всегда должен соответствовать интервалу подключения по времени. Например, если интервал подключения составляет 20 мс, а частота дискретизации – 16 кГц, то аудиокадр должен содержать 320 образцов.
  • Частота дискретизации в системе ограничена значениями, кратными 8 кГц, чтобы в каждом кадре всегда было целое число образцов независимо от времени формирования кадра или интервала подключения.
  • Перед аудиокадрами должен быть указан байт последовательности. Последовательность байтов <0x0A> должна считаться с переносом, чтобы периферийное устройство могло обнаружить несоответствие или переполнение буфера.
  • Аудиокадр всегда должен помещаться в один пакет LE. Аудиофрейм должен быть отправлен в виде отдельного пакета L2CAP. Размер PDU LE LL должен быть следующим:
    размер полезной нагрузки аудио + 1 (счетчик последовательности) + 6 (4 для заголовка L2CAP, 2 для SDU)
  • Событие подключения должно быть достаточно большим, чтобы вместить два аудиопакета и два пустых пакета для ACK, чтобы зарезервировать пропускную способность для повторных передач. Обратите внимание, что аудиопакет может быть фрагментирован контроллером Bluetooth центрального устройства. Периферийное устройство должно быть способно получать более двух фрагментированных аудиопакетов за одно событие подключения.

Чтобы обеспечить центральному устройству некоторую гибкость, длина пакета G.722 не указывается. Длина пакета G.722 может меняться в зависимости от интервала подключения, заданного центральным устройством.

Формат выходного октета G.722 описан в Рекомендации МСЭ-Т G.722 (09/2012), раздел 1.4.4 "Мультиплексор".

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

Кодек Битрейт Интервал подключения Длина CE (PHY 1M/2M) Размер аудиоконтента
G.722 @ 16 kHz 64 кбит/с 20 мс 5000/3750 us 160 байт

Как запустить и остановить аудиопоток

Перед запуском аудиопотока центральное устройство запрашивает периферийные устройства и устанавливает общий кодек. Затем настройка потока выполняется в следующей последовательности:

  1. PSM и, при необходимости, RenderDelay. Эти значения могут быть сохранены в кеше центрального сервера.
  2. Открыт канал CoC L2CAP – периферийное устройство должно предоставить восемь кредитов изначально.
  3. Обновление подключения выполняется для переключения связи на параметры, необходимые для выбранного кодека. Центральное устройство может выполнить это обновление до подключения CoC на предыдущем шаге.
  4. Оба хоста ждут события завершения обновления.
  5. Перезапустите аудиокодер и сбросьте счетчик последовательности пакетов до 0. В AudioControlPoint выполняется команда «Start» с нужными параметрами. Перед началом потоковой передачи центральное устройство ожидает от периферийного уведомления об успешном выполнении предыдущей команды «Start». Это время необходимо для подготовки периферийного устройства к воспроизведению аудио. Во время потоковой передачи аудио реплика должна быть доступна при каждом событии подключения, даже если текущая задержка реплики не равна нулю.
  6. Периферийное устройство берет первый аудиопакет из своей внутренней очереди (порядковый номер 0) и воспроизводит его.

Основная проблема заключается в том, что команда Stop (Остановить) закрывает аудиопоток. После выполнения этой команды периферийное устройство не обязательно должно быть доступно при каждом событии подключения. Чтобы возобновить потоковую передачу аудио, выполните описанные выше действия, начиная с шага 5. Когда центральное устройство не передает аудио, оно должно поддерживать LE-подключение для сервисов GATT.

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