Sinyal Iklan Penyedia

Iklan: Kapan 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 diputar.

Interval iklan: Saat dapat ditemukan

Interval antar-iklan tidak boleh lebih besar dari 100 md (10 Hz). Kecepatan yang cepat memungkinkan Pencari 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 akan berupa UUID Layanan Sambungan Cepat dari 0xFE2C. Data layanan harus berisi hal berikut:

Oktet Jenis data Deskripsi Nilai
0-2 uint24 ID model 24-bit bervariasi

Iklan: Jika tidak dapat ditemukan

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

Dengan mengiklankan data akun, Pencari di sekitar dapat mengenali saat penyedia milik akun mereka dan memulai penyambungan tanpa harus memaksa penyedia kembali ke mode penyambungan terlebih dahulu, yang merupakan penyebab umum keluhan pengguna. Pencari akan memberikan kesempatan bagi pengguna untuk mengabaikan siaran ini jika mereka tidak menunggu untuk disambungkan dengan penyedia atau siaran tidak relevan (misalnya, jika mereka sudah disambungkan). Pencari juga akan otomatis memfilter siaran yang jelas-jelas buruk, seperti saat data akun salah dikonfigurasi.

Interval iklan: Jika tidak dapat ditemukan

Interval antara iklan tidak boleh lebih dari 250 md (4 Hz).

Payload iklan: Data Akun Sambungan Cepat

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

Oktet Jenis data Deskripsi Nilai
0 uint8 Versi dan tanda
0bVVVVFFFF
  • V = versi
  • F = flag
0x00
(disimpan untuk penggunaan di masa mendatang)
1 - bervariasi Data Kunci Akun bervariasi

Data Kunci Akun berisi:

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

Filter Kunci Akun

Filter Kunci Akun yang diiklankan memungkinkan Pencari memeriksa dengan cepat apakah Penyedia mungkin memiliki kunci akun tertentu (dengan probabilitas positif palsu yang rendah, rata-rata jauh di bawah 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 dapat mengurangi tingkat positif palsu lebih lanjut. Dalam beberapa situasi, Penyedia mungkin ingin dikenali oleh Pencari saat belum siap untuk penyambungan. Salah satu contohnya adalah saat bud dimasukkan kembali ke dalam casing, kita ingin berhenti menampilkan notifikasi penyambungan berikutnya karena penyambungan tersebut dapat ditolak oleh headset.

Filter Kunci Akun adalah filter Bloom berpanjang 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 terpotong. Misalnya, jika 1 kunci dipertahankan, s = 4 byte.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Lakukan inisialisasi filter F sebagai array byte s, 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. Hash V menggunakan SHA256, yang menghasilkan nilai 32 byte H = {H0, …, H31}.

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

    c. Bagi H menjadi delapan bilangan bulat tanpa tanda tangan 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 dalam 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 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.