供應商廣告信號

廣告:可供偵測時

當供應端裝置可透過 BR/EDR 偵測 (即處於配對模式) 時,應透過 BLE 廣播快速配對模型 ID 資料,且 BLE 位址不得輪替。

廣告間隔:可供偵測時

廣告間隔不得超過 100 毫秒 (10 Hz)。快速率可讓尋找端快速找到提供端,即使在低功耗模式下掃描也一樣。

廣告酬載:快速配對模型 ID 資料

廣告應包含服務資料類型 (同上),§ 1.11. UUID 應為 0xFE2C 的快速配對服務 UUID。服務資料應包含下列內容:

八位元 資料類型 說明 值
0-2 uint24 24 位元型號 ID 不一

LE 音訊分享廣告酬載:快速配對模型 ID 資料和快速配對功能對應

服務資料應包含下列內容:

八位元 資料類型 說明 值
0 uint8 版本和旗標
0bVVVVFFFF
  • V = 版本
  • F = 標記
0x00
1 uint8 欄位長度和類型
0bLLLLTTTT
  • L = 模型 ID 的長度 (以位元組為單位)
  • T = 類型
0bLLLL0111
  • length = 0bLLLL = 不固定
  • type = 0b0111,模型 ID
2 - s 模型 ID 不一
s + 1 uint8 欄位長度和類型
0bLLLLTTTT
  • L = 長度 (以位元組為單位)
  • T = 類型
0bLLLL1000
s + 2 uint8 FP 功能對應 不一
FP 功能對應

快速配對功能對應表是點陣圖,代表供應器支援的快速配對功能。點陣圖的第一個位元組定義如下:

點陣圖 說明
0bRRRRRRSO R - 保留位元,尋找端目前會忽略,應設為 0。
S - FP LE Audio 音訊分享支援 (啟用時設為 1,否則設為 0)。
O - Out of Box (OOB) 位元,如果裝置為全新,則設為 1。

如果供應器支援 FP LE Audio Sharing 規格 (即支援暫時配對、LE Audio Sharing Advertising Payload 和智慧耳機控制第 2 版),請將 FP LE Audio Sharing 支援位元設為 1,否則請設為 0。

如果供應端尚未與任何 FP 搜尋端配對,且為原廠新品 (也就是供應端上沒有 FP 帳戶金鑰),請將 OOB 位元設為 1,否則設為 0。

協調組合資訊廣告酬載:快速配對模型 ID 資料和快速配對協調組合資訊

服務資料應包含下列內容:

八位元 資料類型 說明 值
0 uint8 版本和旗標
0bVVVVFFFF
  • V = 版本
  • F = 標記
0x00
1 uint8 欄位長度和類型
0bLLLLTTTT
  • L = 模型 ID 的長度 (以位元組為單位)
  • T = 類型
0bLLLL0111
  • length = 0bLLLL = 不固定
  • type = 0b0111,模型 ID
2 - s 模型 ID 不一
s + 1 uint8 欄位長度和類型
0bLLLLTTTT
  • L = 協調組合資料的長度
  • T = 類型
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 FP 協調組合資料 6 位元組資料,請參閱「FP 協調組合資訊」
FP 協調組合資訊

FP 協調組資訊用於識別廣告裝置是否在同一個協調組中。

八位元 資料類型 說明 值
0 uint8 協調組合大小 不一
1 uint8 快速配對協調組合的成員類型 可以是下列其中一項:
  • 0x00:左側元件
  • 0x01:右側元件
2 - 5 uint32 設定身分解析金鑰雜湊 不一

產生 Set Identity Resolving Key 雜湊值的演算法為

  • 使用 SHA256 雜湊 SIRK 值

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • 擷取前四個位元組做為雜湊值

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

如要瞭解 Set Identity Resolving Key,請參閱「協調集識別服務」。

廣告:無法偵測時

當供應商裝置無法偵測 (即未處於配對模式) 時,應按照下列規範,advertise 快速配對帳戶資料。

廣告帳戶資料可讓附近的尋找端辨識提供端是否屬於其帳戶,並啟動配對,而不必先強制提供端返回配對模式,這是使用者常見的抱怨原因。如果使用者不想等待與提供者配對,或廣播不相關 (例如已配對),尋找者會提供機會讓使用者忽略這項廣播。Seeker 也會自動篩除明顯不正確的廣播,例如帳戶資料設定錯誤時。

廣告間隔:不可偵測時

廣告間隔不得超過 250 毫秒 (4Hz)。

廣告酬載:快速配對帳戶資料

廣告應包含服務資料類型,同上,§ 1.11. UUID 應為 0xFE2C 的快速配對服務 UUID。服務資料應包含下列內容:

八位元 資料類型 說明 值
0 uint8 版本和旗標
0bVVVVFFFF
  • V = 版本
  • F = 標記
0x00
(預留供日後使用)
1 - 視情況而定 帳戶金鑰資料 不一

帳戶金鑰資料包含:

八位元 資料類型 說明 值
0 uint8 欄位長度和類型
0bLLLLTTTT
  • L = 帳戶金鑰篩選器的長度 (以位元組為單位)
  • T = 類型
0bLLLL0000
  • length = 0bLLLL = 不固定
  • type = 0b0000 (顯示 UI 指示) 或 0b0010 (隱藏 UI 指示),帳戶金鑰篩選器
1 - s 帳戶金鑰篩選器 不一
s + 1 uint8 欄位長度和類型
0bLLLLTTTT
  • L = 長度 (以位元組為單位)
  • T = 類型
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001,Salt
s + 2 - s + 3 uint16 Salt 不一

帳戶金鑰篩選器

廣告帳戶金鑰篩選器可讓尋找端在進一步互動前,快速檢查提供端是否可能擁有特定帳戶金鑰 (偽陽性機率低,平均遠低於 0.5%)。當搜尋器看到廣播的篩選器類型為 0 (即顯示 UI 指示),且可能包含其中一個帳戶金鑰時,可能會自動連線並嘗試啟動程序,進一步降低誤判率。在某些情況下,Provider 可能希望 Seeker 辨識,但尚未準備好配對。舉例來說,當耳機放回充電盒時,我們希望停止顯示後續的配對通知,因為耳機可能會拒絕配對。

帳戶金鑰篩選器是可變長度的布隆篩選器,建構方式如下:

  1. 假設 n 是永久帳戶金鑰清單中的帳戶金鑰數量 (n >= 1)。
  2. 假設 s (篩選器大小,以位元組為單位) 為 (1.2*n + 3) 截斷。舉例來說,如果保留 1 個鍵,s = 4 個位元組。
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. 將篩選器 F 初始化為 s 個位元組的陣列,每個位元組都設為 0。
    uint8_t F[s] = {0};
  4. 針對永久帳戶金鑰清單中的每個帳戶金鑰 K:
    a. 將 V 設為 concat(K, Salt)。

    // In the sample code, the size of salt is 2 bytes.
    #define SALT_SIZE 2
    
    uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE];
    for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++)
      {
         // concat (K, Salt)
          fastpair_get_account_key_by_index(keyIndex, V);
    
          uint8_t randomSalt = (uint8_t)rand();
          V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt;
          ... }
    

    b. 使用 SHA256 雜湊 V,取得 32 位元組值 H = {H0, …, H31}。

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    c. 將 H 劃分為八個 4 位元組無正負號整數 (大端序),X = {X0, …, X7},其中 X0 = 0xH0H1H2H3。

         uint32_t X[8];
         for (index = 0; index < 8; index++)
         {
            X[index] = (((uint32_t)(H[index * 4])) << 24) |
                        (((uint32_t)(H[index * 4 + 1])) << 16) |
                        (((uint32_t)(H[index * 4 + 2])) << 8) |
                        (((uint32_t)(H[index * 4 + 3])) << 0);
         }
    

    d. 針對每個 Xi:
    i. 將 M 設為 Xi 模數篩選器中的位元數 (s * 8)。
    ii. 在 F 的索引 (M / 8) 取得位元組,並無條件捨去。
    iii. 在位元組中,將索引 (M % 8) 的位元設為 1。
    iv. 換句話說:

        // M = Xi % (s * 8)
        // F[M/8] = F[M/8] | (1 << (M % 8))
        for (index = 0; index < 8; index++)
        {
            uint32_t M    = X[index] % (s * 8);
            F[M / 8] = F[M / 8] | (1 << (M % 8));
        }
    

在廣告資料中,加入篩選器 F 做為帳戶金鑰篩選器欄位。請注意,這個值沒有「位元組序」,因為沒有更重要或更不重要的位元組,請勿更改位元組順序。

鹽田

鹽是建構布隆篩選器時,附加至帳戶金鑰的隨機值。每次為供應商更新 RPA 時,都應重新產生這個鹽,以免在位址輪替時遭到追蹤。

如要使用鹽產生帳戶金鑰篩選器,請按照下列步驟操作:

  1. 產生隨機的 2 位元組 S。請注意,這個值沒有「位元組序」,因為沒有更重要或更不重要的位元組,請勿變更位元組順序。
  2. 使用 2 位元組的 S 做為鹽。
  3. 在廣告的快速配對帳戶資料中,將產生的篩選器加入「Account Key Filter」欄位,並將 S 加入「Salt」欄位。