供應商廣告信號

廣告:曝光時

如果系統能偵測到 BR/EDR 提供者裝置 (也就是處於配對模式),就會透過 BLE 通告快速配對模型 ID 資料,且不會旋轉 BLE 位址。

廣告間隔:發現

廣告之間的間隔時間不得超過 100 毫秒 (10 Hz)。即使有低功耗模式掃描,快速速率可以讓 Finder 快速找到提供者。

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

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

小八 資料類型 說明
0 到 2 年 uint24 24 位元模型 ID 多樣性

廣告:無法偵測

如果找不到 (且不是配對模式),「供應器」裝置應依照下列指南 執行「快速配對帳戶資料」。

透過運用帳戶資料,鄰近的 Seer 就能辨識供應者是否屬於他們的帳戶,進而啟動配對作業,而不必先強制供應商重新採用配對模式,這也是使用者申訴的常見原因。搜尋者可以讓使用者在未等待與該提供者配對或沒有關聯性 (例如已配對) 的情況下,忽略這個廣播。搜尋工具也會自動過濾明顯錯誤的廣播,例如帳戶資料設定錯誤。

廣告間隔:不開放探索時

廣告之間的間隔時間最多應為 250ms (4Hz)。

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

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

小八 資料類型 說明
0 uint8 版本與旗標
0bVVVVFFFF
  • V = 版本
  • F = 標記
0x00
(保留供日後使用)
1 - 多樣化 帳戶金鑰資料 帳戶
0x00 (如果帳戶金鑰清單空白)

帳戶金鑰資料包括:

小八 資料類型 說明
0 uint8 欄位長度與類型
0bLLLLTTTT
  • L = 帳戶金鑰篩選器的長度 (以位元組為單位)
  • T = 類型
0bLLLL0000
  • 長度 = 0bLLLL = 長短
  • 類型 = 0b0000 (顯示 UI 指示) 或 0b0010 (隱藏 UI 指示),帳戶金鑰篩選器
1 - 帳戶金鑰篩選器 多樣性
s + 1 鍵 uint8 欄位長度與類型
0bLLLLTTTT
  • L = 長度 (以位元組為單位)
  • T = 類型
0b00100001
  • 長度 = 0b0010 = 2
  • 類型 = 0b0001,
s + 2 - s + 3 uint16 Salt 多樣性

帳戶金鑰篩選器

宣傳的帳戶金鑰篩選器可讓 Seeer 快速檢查供應者是否擁有特定帳戶金鑰 (誤判可能性偏低,平均遠低於 0.5%),然後再進一步互動。當 Seek 偵測到篩選器類型為 0 的廣播 (例如顯示 UI 指示) 時,可能會自動連線並嘗試啟動該程序,而當中可能包含其其中一個帳戶金鑰,進而進一步降低偽陽率。在某些情況下,即使要進行配對,供應商可能也希望 Seeer 能辨識供應商。其中一個例子是,如果耳機已放回充電盒,由於耳機可能會拒絕配對,因此我們想要停止顯示後續的配對通知。

帳戶金鑰篩選器是長度不定的花卉篩選器,如下所示:

  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 串連為 (KSalt)。

    // 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. 在索引 (M / 8) 處將 F 中的位元組進行四捨五入。
    iii. 在位元組中,將索引位元 (M% 8) 設為 1。
    也就是說:

        // 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] 做為帳戶金鑰篩選器欄位。請注意,此值沒有「字節值」,因為沒有其他或更不重要的位元組,因此請勿改變位元組順序。

鹽欄位

Salt 是一種隨機值,會在建構花卉篩選器時附加至帳戶金鑰。每次更新 RPA 時,應重新產生這個鹽,以避免提供者進行地址旋轉追蹤。

使用 salt 產生帳戶金鑰篩選器的方法如下:

  1. 產生隨機的 2 位元組 S。請注意,此值沒有「字節順序」,因為沒有其他或更不重要的位元組,因此請勿變更位元組順序。
  2. 請使用 2 位元組 S 做為鹽。
  3. 在通告的快速配對帳戶資料中,在 [Account Key Filter] (帳戶金鑰篩選器) 欄位填入產生的篩選器,並在 Salt 欄位中納入 S