透過藍牙 LE 支援助聽器音訊

助聽器裝置 (HA) 可透過藍牙低功耗 (BLE) 技術,使用連線導向 L2CAP 通道 (CoC) 改善 Android 行動裝置的無障礙功能。CoC 會使用彈性緩衝區來處理多個音訊封包,以便維持穩定的音訊流量,即使在封包遺失的情況下也一樣。這個緩衝區可為助聽器提供音訊品質,但會增加延遲時間。

CoC 的設計參考了 Bluetooth Core Specification Version 5 (BT)。為符合核心規格,本頁面上的所有多位元值都應以小端序讀取。

術語

  • Central:透過藍牙掃描廣告的 Android 裝置。
  • 週邊裝置:透過藍牙傳送廣告封包的助聽器。

網路拓撲和系統架構

在助聽器使用 CoC 時,網路拓撲會假設單一中心和兩個外接裝置 (一個左側和一個右側),如圖 1 所示。藍牙音訊系統會將左側和右側外接裝置視為單一音訊接收端。如果因為單耳配戴或連線中斷而缺少週邊裝置,中央單元會混合左聲道和右聲道,並將音訊傳輸至剩餘的週邊裝置。如果中央裝置與兩個外接裝置的連線中斷,中央裝置會認為連至音訊接收端的連線已中斷。在這種情況下,中樞會將音訊轉送至其他輸出裝置。


圖 1. 使用 CoC 搭配 BLE 將助聽器與 Android 行動裝置配對的拓樸圖

如果中控器未將音訊資料串流至周邊裝置,且可以維持 BLE 連線,則中控器不應與周邊裝置中斷連線。維持連線可讓資料與位於周邊裝置的 GATT 伺服器進行通訊。

配對及連接聽覺輔助裝置時,中控裝置應:

  • 追蹤最近配對的左右側周邊裝置。
  • 假設在存在有效配對時,周邊裝置會處於使用中狀態。連線中斷時,中央單元會嘗試連線或重新連線至已配對的裝置。
  • 假設配對關係遭到刪除,則周邊裝置不會再使用。

在上例中,「配對」是指在作業系統中,以特定 UUID 和左/右指標註冊一組助聽器的動作,而非藍牙配對程序。

系統需求

為了正確實作 CoC,提供良好的使用者體驗,中心和周邊裝置中的藍牙系統應:

  • 實作符合規範的 BT 4.2 以上版本控制器。強烈建議使用 LE 安全連線。
  • 中央裝置支援至少 2 個同時的 LE 連結,並且具備「音訊封包格式和時間」所述的參數。
  • 讓外接裝置支援至少 1 個 LE 連結,並使用「音訊封包格式和時機」一節所述的參數。
  • 具備 LE 信用額度型流量控制功能 [BT Vol 3, Part A, Sec 10.1]。裝置應支援 CoC 上至少 167 個位元組的 MTU 和 MPS 大小,並能緩衝最多 8 個封包。
  • 具有 LE 資料長度擴充功能 [BT Vol 6, Part B, Sec 5.1.9],且酬載至少為 167 個位元組。
  • 讓中樞裝置支援 HCI LE 連線更新指令,並遵守非零值 maximum_CE_Lengthminimum_CE_Length 參數。
  • 讓中央維持兩個 LE CoC 連線的資料傳輸量,並在音訊封包格式和時間中使用連線間隔和酬載大小。
  • 讓周邊裝置在 LL_LENGTH_REQLL_LENGTH_RSP 影格中設定 MaxRxOctetsMaxRxTime 參數,以便將這些規格所需的最小必要值設為最小值。這樣一來,中央單位就能在計算接收影格所需的時間時,最佳化其時間排程器。

強烈建議中央和周邊裝置支援 2MB PHY,如 BT 5.0 規格所述。在 1M 和 2M PHY 上,中樞應支援至少 64 kbit/s 的音訊連結。請勿使用 BLE 長距離 PHY。

CoC 會使用標準藍牙機制進行連結層加密和頻率跳躍。

ASHA GATT 服務

外接裝置應實作下列的 Audio Streaming for Hearing Aid (ASHA) GATT 伺服器服務。外接裝置應在一般可偵測模式下宣傳此服務,讓中央裝置辨識音訊接收端。任何 LE 音訊串流作業都必須加密。BLE 音訊串流包含下列特性:

特徵 屬性 說明
ReadOnlyProperties 已讀 請參閱 ReadOnlyProperties
AudioControlPoint Write 和 Write without Response 音訊串流的控制點。請參閱 AudioControlPoint
AudioStatusPoint 讀取/通知 音訊控制點的狀態回報欄位。請參閱 AudioStatusPoint
音量 寫入而無回應 介於 -128 和 0 之間的位元組,表示要套用至串流音訊信號的衰減量,範圍從 -48 dB 到 0 dB。設定 -128 應視為完全靜音,也就是最小非靜音音量等級為 -127,相當於 -47.625 dB 衰減。在 0 的設定下,從聽覺輔助器傳送的軌跡至軌跡正弦音調應代表 100 dBSPL 輸入。中央應以額定全量串流,並使用這個變數在外接裝置中設定所需的呈現層級。
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}
音量 {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 支援的編解碼器 ID。這是支援的編解碼 ID 位元遮罩。位元位置中的 1 會對應至支援的編解碼。舉例來說,0x0002 表示系統支援 16 kHz 的 G.722。所有其他位元都應設為 0。

DeviceCapabilities

位元 說明
0 裝置側 (0:左側,1:右側)
1 指出裝置是否為獨立裝置並接收單聲道資料,或是裝置是否屬於一組裝置 (0:單聲道,1:雙聲道)
2 裝置是否支援 CSIS (0:不支援,1:支援)
3-7 保留 (設為 0)

HiSyncID

這個欄位必須是所有雙耳裝置的唯一值,但左耳和右耳的值必須相同。

位元組 說明
0-1 製造商的 ID。這是 BTSIG 指派的公司 ID
2-7 用於識別助聽器組合的專屬 ID。此 ID 必須在左側和右側外接裝置上設為相同。

FeatureMap

位元 說明
0 是否支援 LE CoC 音訊輸出串流 (是/否)。
1-7 保留 (設為 0)。

編解碼 ID

如果已設定位元,則系統會支援該特定編解碼。

ID / 位元數 編解碼和取樣率 必要位元率 影格時間 必須在中央 (C) 或周邊 (P) 上使用
0 保留 保留 保留 保留
1 G.722 @ 16 kHz 64 kbit/s 變數 C 和 P
2 到 15 為保留值。
0 也已保留。

AudioControlPoint

當 LE CoC 關閉時,就無法使用這個控制點。如需程序說明,請參閱「開始及停止音訊串流」。

Opcode 引數 GATT 子程序 說明
1 «Start»
  • uint8_t codec
  • uint8_t audiotype
  • int8_t volume
  • int8_t otherstate
寫入並回應,並透過 AudioStatusPoint 特性接收其他狀態通知。 指示周邊裝置重設編解碼器,並開始播放第 0 個影格。編解碼欄位會指出要用於此播放的編解碼 ID。舉例來說,如果編解碼欄位為「1」,表示串流中含有 G.722 16k Hz。

音訊類型位元欄位則表示串流中含有的音訊類型:
  • 0 - 不明
  • 1 - 鈴聲
  • 2 - 電話
  • 3 - 媒體
otherstate 欄位表示雙耳裝置的另一端是否已連線。當其他周邊裝置已連線時,這個欄位值為 1,否則值為 0。

在收到 «Stop» 操作碼之前,周邊裝置不得要求連線更新。
2 «Stop» 寫入並回應,並透過 AudioStatusPoint 特性接收其他狀態通知。 指示周邊裝置停止轉譯音訊。在停止後,應啟動新的音訊設定序列,以便再次轉譯音訊。
3 «Status»
  • uint8_t connected
Write without response 通知已連線的周邊裝置,其他周邊裝置有狀態更新。連結欄位會指出更新類型:
  • 0 - 其他周邊裝置已中斷連線
  • 1 - 已連接其他周邊裝置
  • 2 - 在任一連線上發生了 LE 連線參數更新

AudioStatusPoint

音訊控制點的狀態回報欄位

Opcode 說明
0 狀態正常
-1 不明指令
-2 非法參數

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 - 裝置支援 CSIS (<0: 不支援,1: 支援)
  • 3-7 - 保留。這些位元必須為零。
6-9 已截斷的 HiSyncID HiSyncId 中四個最有意義的位元組。這些位元組應是 ID 中最隨機的部分。

周邊裝置必須有完整的本機名稱 資料類型,用於指示助聽器的名稱。這個名稱會用於行動裝置的使用者介面,方便使用者選取正確的裝置。名稱不得表示左或右聲道,因為這項資訊會在 DeviceCapabilities 中提供。

如果周邊裝置將名稱和 ASHA 服務資料類型放在相同的框架類型 (ADV 或 SCAN RESP),則兩個資料類型 (「完整的本機名稱」和「ASHA 服務的服務資料」) 應顯示在同一框架中。這可讓行動裝置掃描器在同一個掃描結果中取得這兩種資料。

在初始配對期間,周邊裝置的廣告傳送速度必須夠快,才能讓行動裝置快速偵測到周邊裝置並與其建立連結。

同步處理左右兩側周邊裝置

如要在 Android 行動裝置上使用藍牙,周邊裝置必須負責確保同步處理。左側和右側外接裝置的播放內容必須同步。兩部外接裝置必須同時播放來源的音訊樣本。

外接裝置可以使用序號,在每個音訊酬載封包前面加上序號,藉此同步時間。中央系統可確保在每個外接裝置上同時播放的音訊封包具有相同的序號。每個音訊封包後,序號都會遞增 1。每個序號長度為 8 位元,因此序號會在 256 個音訊封包後重複。由於每個連線的音訊封包大小和取樣率皆固定,因此兩個外接裝置可以推斷相對的播放時間。如要進一步瞭解音訊封包,請參閱「音訊封包格式和時間」。

當需要進行同步時,中央輔助功能會向雙耳裝置提供觸發事件。每當有可能影響同步作業的操作時,這些觸發事件就會向每個周邊裝置通知其配對周邊裝置的狀態。觸發條件如下:

  • 作為 AudioControlPoint 的 «Start» 指令一部分,會提供雙耳裝置另一端目前的連線狀態。
  • 每當某個周邊裝置上發生連線、斷線或連線參數更新作業時,AudioControlPoint 的 «Status» 指令就會傳送至雙耳裝置的另一端。

音訊封包格式和時間

將音訊影格 (樣本區塊) 封裝至封包,讓聽力檢測工具從連結層時間錨點推導時間。為簡化實作程序:

  • 音訊影格應一律與連線間隔時間相符。舉例來說,如果連線間隔為 20 毫秒,而取樣率為 16 kHz,則音訊影格應包含 320 個取樣。
  • 系統中的取樣率僅限於 8 kHz 的倍數,這樣一來,無論影格時間或連線間隔為何,影格中一律都會有整數個樣本。
  • 序號位元組應置於音訊影格之前。序列位元組應以循環計數,並允許周邊裝置偵測緩衝區不相符或溢位。
  • 音訊影格一律會放入單一 LE 封包。音訊影格應以獨立的 L2CAP 封包傳送。LE LL PDU 的大小應為:
    音訊酬載大小 + 1 (序號計數器) + 6 (L2CAP 標頭為 4,SDU 為 2)
  • 連線事件應一律足夠大,可容納 2 個音訊封包和 2 個空白封包,以便 ACK 保留重新傳送的頻寬。請注意,音訊封包可能會因中央藍牙控制器而分割。外接裝置必須能夠在每個連線事件中接收超過 2 個分割的音訊封包。

為提供中央一些彈性,我們並未指定 G.722 封包長度。G.722 封包長度可能會根據中央設定的連線間隔而變更。

G.722 輸出位元組格式參照 Rec. ITU-T G.722 (09/2012) 的 1.4.4 節「Multiplexer」

對於周邊裝置支援的所有編解碼,周邊裝置應支援下列連線參數。以下列舉中央主機可實作的設定 (僅列舉部分內容)。

轉碼器 位元率 連線間隔 CE 長度 (1M/2M PHY) 音訊酬載大小
G.722 @ 16 kHz 64 kbit/s 20 毫秒 5000/3750 us 160 個位元組

開始及停止音訊串流

在開始音訊串流之前,中央會查詢周邊裝置,並建立共同分母轉碼器。接著,串流設定會依照以下順序進行:

  1. 系統會讀取 PSM,並視需要讀取 RenderDelay。這些值可能會由中央伺服器快取。
  2. CoC L2CAP 通道已開啟 – 周邊裝置應會在初始階段授予 8 個信貸。
  3. 系統會發出連線更新,將連結切換至所選編解碼器所需的參數。中央可能會在前一個步驟的 CoC 連線之前執行這項連線更新。
  4. 中央主機和周邊主機都會等待更新完成事件。
  5. 重新啟動音訊編碼器,並將封包序列計數重設為 0。系統會在 AudioControlPoint 上發出含有相關參數的 «Start» 指令。中央單元會等待外接裝置先前的 «Start» 指令成功傳送狀態通知,然後才開始串流。這段等待時間可讓周邊裝置有時間準備音訊播放管道。在音訊串流期間,即使目前的備援機制延遲可能不為零,備援機制仍應在每個連線事件中可用。
  6. 外接裝置會從內部佇列 (序號 0) 取出第一個音訊封包並播放。

中樞會發出「Stop」指令,關閉音訊串流。執行此指令後,周邊裝置不必在每個連線事件中都提供服務。如要重新啟動音訊串流,請從步驟 5 開始執行上述步驟。當中樞未串流音訊時,仍應為 GATT 服務維持 LE 連線。

周邊裝置不得向中央裝置發出連線更新。為節省電力,當外接裝置未串流音訊時,中樞可能會向外接裝置發出連線更新。