블루투스 LE를 사용한 보청기 오디오 지원

보청기(HA)는 저전력 블루투스(BLE)를 통한 연결 지향 L2CAP 채널(CoC)을 사용하여 Android 지원 휴대기기에서 접근성을 개선할 수 있습니다. CoC는 여러 오디오 패킷의 탄력적인 버퍼를 사용하여 패킷 손실이 있을 때도 안정적인 오디오 흐름을 유지합니다. 이 버퍼는 지연 시간이 있는 대신 보청기용 음질을 제공합니다.

CoC의 설계는 블루투스 핵심 사양 버전 5(BT)를 참조합니다. 핵심 사양과 일치하도록 이 페이지의 모든 멀티바이트 값은 little-endian으로 간주됩니다.

용어

  • 중앙 기기 - 블루투스를 통해 광고를 검색하는 Android 기기.
  • 주변기기 - 블루투스를 통해 광고 패킷을 전송하는 보청기.

네트워크 토폴로지 및 시스템 아키텍처

보청기를 위해 CoC를 사용할 때 네트워크 토폴로지는 그림 1에 표시된 대로 중앙 기기 1개와 주변기기 2개(왼쪽과 오른쪽에 하나씩)가 있다고 가정합니다. 블루투스 오디오 시스템은 왼쪽과 오른쪽 주변기기를 단일 오디오 싱크로 간주합니다. 모노럴 피트 또는 연결 중단으로 인해 주변기기가 누락된 경우 중앙 기기는 왼쪽과 오른쪽 오디오 채널을 혼합하고 오디오를 나머지 주변기기에 전송합니다. 중앙 기기와 두 주변기기의 연결이 중단되면 중앙 기기에서는 오디오 싱크와 연결이 중단된 것으로 간주합니다. 이러한 경우 중앙 기기에서는 오디오를 다른 출력으로 라우팅합니다.


그림 1. BLE를 통한 CoC를 사용하여 보청기와 Android 휴대기기를 페어링하기 위한 토폴로지

중앙 기기에서 오디오 데이터를 주변기기로 스트리밍하지 않고 BLE 연결을 유지할 수 있는 경우, 중앙 기기와 주변기기의 연결을 중단해서는 안 됩니다. 연결을 유지하면 주변기기에 있는 GATT 서버와 데이터 통신이 가능합니다.

보청기를 페어링하고 연결하는 경우 중앙 기기에서는 다음 작업을 실행합니다.

  • 더 최근에 페어링된 왼쪽과 오른쪽 주변기기를 추적합니다.
  • 유효한 페어링이 존재하는 경우 주변기기가 사용 중이라고 가정합니다. 연결이 중단되면 중앙 기기에서 페어링된 기기와 연결하거나 다시 연결하려고 시도합니다.
  • 페어링이 삭제되면 주변기기가 더 이상 사용되지 않는다고 가정합니다.

위의 경우 페어링은 블루투스 페어링 절차가 아니라 주어진 UUID 및 OS의 왼쪽/오른쪽 지정자를 사용하여 보청기 세트를 등록하는 작업을 가리킵니다.

시스템 요구사항

우수한 사용자 환경을 위해 CoC를 제대로 구현하려면 중앙 및 주변기기의 블루투스 시스템이 다음 조건을 충족해야 합니다.

  • 규격에 맞는 BT 4.2 이상의 컨트롤러를 구현해야 합니다. LE 보안 연결을 사용하는 것이 좋습니다.
  • 중앙 기기가 오디오 패킷 형식 및 타이밍에 설명된 매개변수가 있는 동시 LE 링크를 2개 이상 지원해야 합니다.
  • 주변기기가 오디오 패킷 형식 및 타이밍에 설명된 매개변수가 있는 LE 링크를 1개 이상 지원해야 합니다.
  • LE 크레딧 기반 흐름 제어 기능[BT 3권, A편, 10.1절]이 있어야 합니다. 기기는 CoC에서 167바이트 이상의 MTU 및 MPS 크기를 지원하고 최대 8개의 패킷을 버퍼링할 수 있어야 합니다.
  • 페이로드가 167바이트 이상인 LE 데이터 길이 확장 기능[BT 6권, B편, 5.1.9절]이 있어야 합니다.
  • 중앙 기기가 HCI LE 연결 업데이트 명령어를 지원하고 0이 아닌 maximum_CE_Lengthminimum_CE_Length 매개변수를 준수해야 합니다.
  • 중앙 기기가 오디오 패킷 형식 및 타이밍의 연결 간격과 페이로드 크기로 서로 다른 주변기기 2개의 두 LE CoC 연결을 위한 데이터 처리량을 유지해야 합니다.
  • 주변기기에서 LL_LENGTH_REQ 또는 LL_LENGTH_RSP 프레임의 MaxRxOctetsMaxRxTime 매개변수를 이 사양에 필요한 가장 작은 필수 값으로 설정해야 합니다. 이렇게 하면 중앙 기기에서 프레임을 수신하는 데 필요한 시간을 계산할 때 시간 스케줄러를 최적화할 수 있습니다.

BT 5.0 사양에 지정된 대로 중앙 및 주변기기가 2MB PHY를 지원하는 것이 좋습니다. 중앙 기기는 1M 및 2M PHY 모두에서 64kbit/초 이상의 오디오 링크를 지원해야 합니다. BLE 장거리 PHY를 사용해서는 안 됩니다.

CoC는 링크 레이어 암호화 및 주파수 호핑에 표준 블루투스 메커니즘을 사용합니다.

ASHA GATT 서비스

주변기기는 아래에 설명된 보청기용 오디오 스트리밍(ASHA) GATT 서버 서비스를 구현합니다. 주변기기는 중앙 기기가 오디오 싱크를 인식할 수 있는 일반 검색 가능 모드에 있을 때 이 서비스를 광고합니다. 모든 LE 오디오 스트리밍 작업에는 암호화가 필요합니다. BLE 오디오 스트리밍은 다음과 같은 특성으로 구성됩니다.

특성 속성 설명
ReadOnlyProperties 읽기 ReadOnlyProperties를 참조하세요.
AudioControlPoint 쓰기 및 응답 없이 쓰기 오디오 스트림의 제어점입니다. AudioControlPoint를 참조하세요.
AudioStatusPoint 읽기/알림 오디오 제어점의 상태 보고 필드입니다. 명령 코드:
  • 0 - 상태 양호
  • -1 - 알 수 없는 명령어
  • -2 - 잘못된 매개 변수
Volume 응답 없이 쓰기 스트리밍된 오디오 신호에 적용할 감쇠량(-48dB~0dB)을 나타내는 -128과 0 사이의 바이트입니다. -128을 설정하면 완전히 음소거된 것으로 해석됩니다. 즉 음소거되지 않은 최저 볼륨은 -127로 -47.625dB 감쇠와 같습니다. 설정 0에서 스트리밍된 레일 간 사인 톤은 보청기에서 100dBSPL과 동일한 입력을 나타냅니다. 중앙 기기는 명목상 풀 스케일로 스트리밍하며 이 변수를 사용하여 주변기기에서 원하는 프레젠테이션 수준을 설정합니다.
LE_PSM_OUT 읽기 오디오 채널 연결에 사용할 PSM입니다. 동적 범위 [BT 3권, A편, 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 나중에 사용하기 위해 예약되어 있습니다. 0으로 초기화됩니다.
15~16 지원되는 코덱 ID. 지원되는 코덱 ID의 비트마스크입니다. 비트 위치의 1은 지원되는 코덱에 상응합니다. 예를 들어 0x0002는 G.722 @ 16kHz가 지원됨을 나타냅니다. 다른 비트는 모두 0으로 설정해야 합니다.

DeviceCapabilities

비트 설명
0 기기 측(왼쪽: 0, 오른쪽: 1)
1 모노럴(0)/바이노럴(1). 기기가 독립 실행형이며 모노 데이터를 수신하는지 또는 기기가 세트의 일부인지를 나타냅니다.
2~7 예약됨(0으로 설정됨).

HiSyncID

이 필드는 모든 바이노럴 기기에서 고유해야 하지만 왼쪽 및 오른쪽 세트에서 동일해야 합니다.

바이트 설명
0~1 제조업체의 ID. BTSIG에서 할당한 회사 식별자입니다.
2~7 보청기 세트를 나타내는 고유 ID. 이 ID는 왼쪽 및 오른쪽 주변기기에서 동일하게 설정해야 합니다.

FeatureMap

비트 설명
0 LE CoC 오디오 출력 스트리밍 지원됨(예/아니요).
1~7 예약됨(0으로 설정됨).

코덱 ID

비트가 설정되면 특정 코덱이 지원됩니다.

ID / 비트 번호 코덱 및 샘플링 레이트 필수 비트 전송률 프레임 시간 중앙(C) 또는 주변기기(P)에서 필수 여부
0 예약됨 예약됨 예약됨 예약됨
1 G.722 @ 16 kHz 64kbit/초 가변 C 및 P
2~15는 예약되어 있습니다.
0도 예약되어 있습니다.

AudioControlPoint

LE CoC가 닫혀 있을 때는 이 제어점을 사용할 수 없습니다. 절차에 관한 설명은 오디오 스트림 시작 및 중지를 참조하세요.

명령 코드 인수 설명
1 «Start»
  • uint8_t codec
  • uint8_t audiotype
  • int8_t volume
  • int8_t otherstate
코덱을 재설정하고 프레임 0의 재생을 시작하도록 주변기기에 지시합니다. 코덱 필드는 이 재생에 사용할 코덱 ID를 나타냅니다. 예를 들어 G.722 @ 16kHz의 경우 코덱 필드는 '1'입니다.

오디오 유형 비트 필드는 스트림에 있는 오디오 유형을 나타냅니다.
  • 0 - 알 수 없음
  • 1 - 벨소리
  • 2 - 전화 통화
  • 3 - 미디어
otherstate 필드는 바이노럴 기기의 반대쪽이 연결되어 있는지를 나타냅니다. 다른 주변기기가 연결되어 있으면 필드 값이 1이고 그렇지 않은 경우에는 값이 0입니다.

주변기기는 «Stop» 명령 코드가 수신되기 전에 연결 업데이트를 요청해서는 안 됩니다.
2 «Stop» 없음 오디오 렌더링을 중지하도록 주변기기에 지시합니다. 오디오를 다시 렌더링하려면 이 중지 후에 새로운 오디오 설정 순서를 시작해야 합니다.
3 «Status»
  • uint8_t connected
연결된 주변기기에 다른 주변기기의 상태가 업데이트되었음을 알립니다. 연결된 필드는 업데이트 유형을 나타냅니다.
  • 0 - 다른 주변기기 연결 해제됨
  • 1 - 다른 주변기기 연결됨
  • 2 - 둘 중 하나의 연결에서 LE 연결 매개변수 업데이트 발생함

ASHA GATT 서비스용 광고

서비스 UUID는 광고 패킷에 있어야 합니다. 광고 또는 검색 응답 프레임에서 주변기기에 서비스 데이터가 있어야 합니다.

바이트 오프셋 이름 설명
0 광고 길이 >= 0x09
1 광고 유형 0x16(서비스 데이터 - 16비트 UUID)
2~3 서비스 UUID 0xFDF0(little-endian)
참고: 임시 ID입니다.
4 프로토콜 버전 0x01
5 기능
  • 0 - 왼쪽(0) 또는 오른쪽(1).
  • 1 - 단일(0) 또는 이중(1) 기기.
  • 2~7 - 예약됨. 이 비트는 0이어야 합니다.
6~9 잘린 HiSyncID HiSyncId의 최하위 4바이트. 이러한 바이트는 ID의 가장 임의적인 부분이어야 합니다.

주변기기에는 보청기의 이름을 나타내는 전체 로컬 이름 데이터 유형이 있어야 합니다. 이 이름은 사용자가 올바른 기기를 선택할 수 있도록 휴대기기의 사용자 인터페이스에서 사용됩니다. 이 정보는 DeviceCapabilities에 제공되므로 이름이 왼쪽 또는 오른쪽 채널을 나타내서는 안 됩니다.

주변기기에서 동일한 프레임 유형(ADV 또는 SCAN RESP)에 이름과 ASHA 서비스 데이터 유형을 추가하면 두 데이터 유형('전체 로컬 이름 및 'ASHA 서비스용 서비스 데이터')이 동일한 프레임에 표시됩니다. 이에 따라 휴대기기 스캐너가 동일한 검색 결과에서 두 데이터를 모두 가져올 수 있습니다.

초기 페어링 시 주변기기가 휴대기기에서 주변기기를 신속하게 검색하고 연결할 수 있을 만큼 빠른 속도로 광고하는 것이 중요합니다.

왼쪽 및 오른쪽 주변기기 동기화

Android 휴대기기에서 블루투스를 사용하려면 주변기기를 동기화해야 합니다. 왼쪽과 오른쪽 주변기기의 재생 기능을 제시간에 동기화해야 합니다. 두 주변기기 모두 소스의 오디오 샘플을 동시에 재생해야 합니다.

주변기기는 오디오 페이로드의 각 패킷 앞에 추가된 순서 번호를 사용하여 시간을 동기화할 수 있습니다. 중앙 기기는 각 주변기기에서 동시에 재생되어야 하는 오디오 패킷의 순서 번호를 동일하게 해줍니다. 순서 번호는 각 오디오 패킷 후 1씩 증가합니다. 각 순서 번호의 길이가 8비트이므로 오디오 패킷 256개 후 순서 번호가 반복됩니다. 연결마다 각 오디오 패킷 크기 및 샘플링 레이트가 고정되므로 두 주변기기가 상대적 재생 시간을 추론할 수 있습니다. 오디오 패킷에 관한 자세한 내용은 오디오 패킷 형식 및 타이밍을 참조하세요.

중앙 기기는 동기화가 발생해야 하는 경우 바이노럴 기기에 트리거를 제공하여 지원합니다. 이러한 트리거는 동기화에 영향을 줄 수 있는 작업이 있을 때마다 각 주변기기에 페어링된 주변기기의 상태를 알립니다. 트리거의 특징은 다음과 같습니다.

  • AudioControlPoint의 «Start» 명령어 일부로 바이노럴 기기 다른 쪽의 현재 연결 상태가 제공됩니다.
  • 하나의 주변기기에 연결, 연결 해제 또는 연결 매개변수 업데이트 작업이 있을 때마다 AudioControlPoint의 «Status» 명령어가 바이노럴 기기의 다른 쪽에 전송됩니다.

오디오 패킷 형식 및 타이밍

오디오 프레임(샘플 블록)을 패킷으로 패킹하면 보청기가 링크 레이어 타이밍 앵커에서 타이밍을 가져올 수 있습니다. 구현을 간소화하려면 다음을 따르세요.

  • 오디오 프레임은 항상 연결 간격(시간)과 일치해야 합니다. 예를 들어, 연결 간격이 20ms이고 샘플링 레이트가 16kHz이면 오디오 프레임에 샘플 320개가 포함됩니다.
  • 시스템의 샘플링 레이트는 프레임 시간이나 연결 간격과 관계없이 프레임에 항상 정수 개수의 샘플만 포함되도록 8kHz의 배수로 제한됩니다.
  • 순서 바이트에서는 오디오 프레임이 앞에 추가됩니다. 순서 바이트는 순환하면서 계산되고, 주변기기에서는 순서 바이트를 사용하여 버퍼 불일치 또는 언더플로우를 감지할 수 있습니다.
  • 오디오 프레임은 항상 단일 LE 패킷에 맞습니다. 오디오 프레임은 별도의 L2CAP 패킷으로 전송됩니다. LE LL PDU의 크기는 다음과 같습니다.
    오디오 페이로드 크기 + 1(순서 카운터) + 6(4: L2CAP 헤더, 2: SDU)
  • 연결 이벤트는 항상 ACK에서 재전송 대역폭을 예약하기 위해 오디오 패킷 2개와 빈 패킷 2개를 포함할 수 있을 정도로 커야 합니다. 오디오 패킷은 중앙 기기의 블루투스 컨트롤러에 의해 세분화될 수도 있습니다. 주변기기는 연결 이벤트당 세분화된 오디오 패킷을 3개 이상 수신할 수 있어야 합니다.

중앙 기기에 어느 정도 유연성을 제공하기 위해 G.722 패킷 길이는 지정되지 않습니다. G.722 패킷 길이는 중앙 기기에서 설정하는 연결 간격에 따라 달라질 수 있습니다.

G.722 출력 옥텟 형식은 Rec. ITU-T G.722(09/2012) 섹션 1.4.4 '멀티플렉서'를 참조합니다.

주변기기는 주변기기가 지원하는 모든 코덱에 관해 아래의 연결 매개변수를 지원합니다. 이 목록은 중앙 기기에서 구현할 수 있는 구성의 대략적인 목록입니다.

코덱 비트 전송률 연결 간격 CE 길이(1M/2M PHY) 오디오 페이로드 크기
G.722 @ 16 kHz 64kbit/초 20ms 5000/3750us 160바이트

오디오 스트림 시작 및 중지

오디오 스트림을 시작하기 전에 중앙 기기는 주변기기를 쿼리하고 공통분모 코덱을 설정합니다. 그런 다음 다음과 같은 순서로 스트림 설정이 진행됩니다.

  1. PSM 및 RenderDelay(선택 사항)를 읽습니다. 이러한 값은 중앙 기기에 의해 캐시될 수도 있습니다.
  2. CoC L2CAP 채널이 열립니다. 주변기기는 초기에 8크레딧을 부여합니다.
  3. 링크를 선택된 코덱에 필요한 매개변수로 전환하기 위해 연결 업데이트가 실행됩니다. 이전 단계에서 CoC 연결 전에 중앙 기기가 이 연결 업데이트를 실행할 수도 있습니다.
  4. 중앙 기기와 주변기기 호스트 모두 업데이트 이벤트가 완료될 때까지 기다립니다.
  5. 오디오 인코더를 다시 시작하고 패킷 순서 번호를 0으로 재설정합니다. 관련 매개변수를 사용한 «Start» 명령어가 AudioControlPoint에서 실행됩니다. 중앙 기기는 스트리밍 전에 주변기기로부터 이전 «Start» 명령어의 성공적인 상태 알림이 전송될 때까지 기다립니다. 이 대기 시간 동안 주변기기는 오디오 재생 파이프라인을 준비할 수 있습니다. 오디오 스트리밍 중에는 현재 복제본 지연 시간이 0이 아니더라도 모든 연결 이벤트에서 복제본을 사용할 수 있어야 합니다.
  6. 주변기기가 내부 대기열에서 첫 번째 오디오 패킷(순서 번호 0)을 가져와 재생합니다.

중앙 기기는 «Stop» 명령어를 실행하여 오디오 스트림을 닫습니다. 이 명령어 다음에는 모든 연결 이벤트에서 주변기기를 사용할 필요가 없습니다. 오디오 스트리밍을 다시 시작하려면 위의 순서를 5단계부터 진행합니다. 중앙 기기는 오디오를 스트리밍하지 않는 경우에도 GATT 서비스를 위한 LE 연결을 유지해야 합니다.

주변기기에서 중앙 기기에 대한 연결 업데이트를 실행해서는 안 됩니다. 전력을 절약하기 위해 주변기기가 오디오를 스트리밍하고 있지 않은 경우 중앙 기기에서 주변기기에 대한 연결 업데이트를 실행할 수도 있습니다.