Sinyal Pemberitahuan Penyedia

Iklan: Jika dapat ditemukan

Jika perangkat Penyedia dapat ditemukan BR/EDR (yaitu, dalam mode penyambungan), perangkat tersebut akan mengiklankan Data ID Model Sambungan Cepat melalui BLE, dan alamat BLE tidak boleh diubah.

Interval iklan: Jika dapat ditemukan

Interval antara iklan tidak boleh lebih besar dari 100 md (10 Hz). Kecepatan cepat memungkinkan Seeker menemukan Penyedia dengan cepat, bahkan saat memindai dalam mode daya rendah.

Payload iklan: Data ID Model Sambungan Cepat

Iklan harus berisi jenis data Data Layanan, ibid., § 1.11. UUID harus berupa UUID Layanan Sambungan Cepat 0xFE2C. Data layanan harus berisi hal berikut:

Octet Jenis data Deskripsi Nilai
0-2 uint24 ID model 24-bit berbeda-beda

Payload Iklan Berbagi Audio LE: Data ID Model Fast Pair dan Peta Kemampuan FP

Data layanan harus berisi hal berikut:

Octet Jenis data Deskripsi Nilai
0 uint8 Versi dan tanda
0bVVVVFFFF
  • V = versi
  • F = tanda
0x00
1 uint8 Panjang dan jenis kolom
0bLLLLTTTT
  • L = panjang ID model dalam byte
  • T = type
0bLLLL0111
  • panjang = 0bLLLL = berbeda-beda
  • type = 0b0111, ID Model
2 - s ID Model berbeda-beda
s + 1 uint8 Panjang dan jenis kolom
0bLLLLTTTT
  • L = panjang dalam byte
  • T = type
0bLLLL1000
s + 2 uint8 Peta Kemampuan FP berbeda-beda
Peta Kemampuan FP

Peta Kemampuan FP adalah bitmap yang menunjukkan fitur FP yang didukung Penyedia. Byte pertama bitmap ditentukan sebagai berikut:

Bitmap Deskripsi
0bRRRRRRSO R - Bit yang dicadangkan, akan diabaikan oleh pencari untuk saat ini dan harus disetel sebagai 0.
S - Dukungan Berbagi Audio LE FP (disetel ke 1 jika diaktifkan, atau 0 jika tidak).
O - Bit Out of Box (OOB), disetel ke 1 jika perangkat baru dari pabrik.

Jika Penyedia mendukung spesifikasi Berbagi Audio LE FP (artinya mendukung Penyambungan Sementara, Payload Iklan Berbagi Audio LE, dan Hearable control versi 2), setel bit dukungan Berbagi Audio LE FP ke 1; jika tidak, setel ke 0.

Jika Penyedia belum dipasangkan dengan Pencari FP mana pun dan masih baru dari pabrik (artinya tidak ada kunci akun FP di penyedia), setel bit OOB ke 1; jika tidak, setel ke 0.

Iklan: Jika tidak dapat ditemukan

Jika tidak dapat ditemukan (yaitu, tidak dalam mode penyambungan), perangkat Penyedia akan mengiklankan Data Akun Sambungan Cepat, menggunakan panduan berikut.

Mengiklankan data akun memungkinkan Pencari di sekitar mengenali saat penyedia termasuk dalam akun mereka dan memulai penyambungan tanpa harus memaksa penyedia kembali ke mode penyambungan terlebih dahulu, yang merupakan penyebab umum keluhan pengguna. Pencari akan memberikan peluang bagi pengguna untuk dapat mengabaikan siaran ini jika mereka tidak menunggu untuk menyambungkan perangkat dengan penyedia atau siaran tidak relevan (misalnya, jika mereka telah menyambungkan perangkat). Pencari juga akan otomatis memfilter siaran yang jelas-jelas buruk, seperti saat data akun salah dikonfigurasi.

Interval iklan: Jika tidak dapat ditemukan

Interval antar-iklan maksimal 250 md (4 Hz).

Payload iklan: Data Akun Sambungan Cepat

Iklan harus berisi jenis data Data Layanan, Ibid., § 1.11. UUID harus berupa UUID Layanan Sambungan Cepat 0xFE2C. Data layanan harus berisi hal berikut:

Octet Jenis data Deskripsi Nilai
0 uint8 Versi dan tanda
0bVVVVFFFF
  • V = versi
  • F = tanda
0x00
(dipesan untuk penggunaan pada masa mendatang)
1 - berbeda-beda Data Kunci Akun berbeda-beda

Data Kunci Akun berisi:

Octet Jenis data Deskripsi Nilai
0 uint8 Panjang dan jenis kolom
0bLLLLTTTT
  • L = panjang filter kunci akun dalam byte
  • T = type
0bLLLL0000
  • panjang = 0bLLLL = berbeda-beda
  • type = 0b0000 (tampilkan indikasi UI) atau 0b0010 (sembunyikan indikasi UI), Filter Kunci Akun
1 - s Filter Kunci Akun berbeda-beda
s + 1 uint8 Panjang dan jenis kolom
0bLLLLTTTT
  • L = panjang dalam byte
  • T = type
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt berbeda-beda

Filter Kunci Akun

Filter Kunci Akun yang diiklankan memungkinkan Pencari dengan cepat memeriksa apakah Penyedia mungkin memiliki kunci akun tertentu (dengan probabilitas positif palsu yang rendah, rata-rata jauh kurang dari 0,5%), sebelum interaksi lebih lanjut. Pencari dapat terhubung secara otomatis dan mencoba memulai prosedur saat melihat filter yang disiarkan dengan jenis 0, yaitu menampilkan indikasi UI, yang berpotensi berisi salah satu kunci akunnya, sehingga mengurangi tingkat positif palsu lebih lanjut. Dalam beberapa situasi, Penyedia mungkin ingin dikenali oleh Pencari saat tidak siap untuk penyambungan. Salah satu contohnya adalah saat earbud dimasukkan kembali ke dalam casing, kita ingin menghentikan penayangan notifikasi penyambungan berikutnya karena penyambungan tersebut dapat ditolak oleh headset.

Filter Kunci Akun adalah filter Bloom dengan panjang variabel yang dibuat sebagai berikut:

  1. Misalkan n adalah jumlah kunci akun (n >= 1) dalam daftar Kunci Akun yang dipertahankan.
  2. Misalkan s, ukuran filter dalam byte, adalah (1,2*n + 3) yang dipangkas. Misalnya, jika 1 kunci dipertahankan, s = 4 byte.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Inisialisasi filter F sebagai array s byte, yang masing-masing ditetapkan ke 0.
    uint8_t F[s] = {0};
  4. Untuk setiap kunci akun K dalam daftar Kunci Akun yang dipertahankan:
    a. Misalkan V adalah 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. Beri hash V menggunakan SHA256, sehingga mendapatkan nilai 32 byte H = {H0, …, H31}.

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

    c. Bagilah H menjadi delapan bilangan bulat tidak bertanda 4 byte dalam big-endian, X = {X0, …, X7}, dengan 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. Untuk setiap Xi:
    i. Misalkan M adalah Xi modulo jumlah bit dalam filter, (s * 8).
    ii. Dapatkan byte di F pada indeks (M / 8), dibulatkan ke bawah.
    iii. Dalam byte, tetapkan bit pada indeks (M % 8) ke 1.
    iv. Dengan kata lain:

        // 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));
        }
    

Sertakan filter F sebagai kolom Filter Kunci Akun, dalam data iklan. Perhatikan bahwa tidak ada "endianness" untuk nilai ini, karena tidak ada byte yang lebih atau kurang signifikan—jangan ubah urutan byte.

Ladang garam

Salt adalah nilai acak yang ditambahkan ke kunci akun saat membuat filter bloom. Salt ini harus dibuat ulang setiap kali RPA diperbarui untuk Penyedia agar tidak melacak di seluruh rotasi alamat.

Untuk membuat Filter Kunci Akun menggunakan salt:

  1. Buat S 2 byte acak. Perhatikan bahwa tidak ada "endianness" untuk nilai ini, karena tidak ada byte yang lebih atau kurang signifikan — jangan ubah urutan byte.
  2. Gunakan S 2 byte sebagai Salt.
  3. Dalam Data Akun Sambungan Cepat yang diiklankan, sertakan filter yang dihasilkan di kolom Filter Kunci Akun, dan S di kolom Salt.