Sinyal Iklan Penyedia

Iklan: Saat dapat ditemukan

Saat 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 dirotasi.

Interval iklan: Saat dapat ditemukan

Interval antara iklan tidak boleh lebih besar dari 100 md (10 Hz). Tarif cepat memungkinkan Pencari Kerja menemukan Penyedia dengan cepat, bahkan saat melakukan pemindaian dalam mode daya rendah.

Payload iklan: Data ID Model Sambungan Cepat

Iklan tersebut harus berisi jenis data Data Layanan, ibid., § 1,11. UUID ini adalah UUID Layanan Sambungan Cepat 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, bukan dalam mode penyambungan), perangkat Penyedia harus mengiklankan Data Akun Sambungan Cepat, menggunakan panduan berikut.

Dengan mengiklankan data akun, Pencari Lokasi di sekitar dapat mengetahui saat penyedia termasuk dalam akunnya 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 dapat mengabaikan siaran ini jika mereka tidak menunggu untuk menyambungkan dengan penyedia atau siaran tidak relevan (misalnya, jika mereka sudah tersambung). Pencari juga akan otomatis memfilter siaran yang jelas-jelas buruk, seperti saat data akun salah dikonfigurasi.

Interval iklan: Saat tidak dapat ditemukan

Interval antariklan harus maksimal 250 md (4 Hz).

Payload iklan: Data Akun Sambungan Cepat

Iklan tersebut harus berisi jenis data Data Layanan, Ibid., § 1,11. UUID ini adalah UUID Layanan Sambungan Cepat 0xFE2C. Data layanan harus berisi hal berikut:

Oktet Jenis data Deskripsi Nilai
0 uint8 Versi dan tanda
0bVVVVFFFF
  • V = versi
  • F = tanda
0x00
(dicadangkan untuk penggunaan pada masa mendatang)
1 - bervariasi Data Kunci Akun bervariasi
atau 0x00 jika Daftar Kunci Akun kosong

Data Kunci Akun berisi:

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

Filter Kunci Akun

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

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

  1. Biarkan n adalah jumlah kunci akun (n >= 1) dalam daftar Kunci Akun yang dipertahankan.
  2. Misalkan s, ukuran filter dalam byte (1, 2*n + 3) akan 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, masing-masing disetel ke 0.
    uint8_t F[s] = {0};
  4. Untuk setiap kunci akun K dalam daftar Kunci Akun yang dipertahankan:
    a. Biarkan V menjadi 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. Lakukan hash V menggunakan SHA256, untuk mendapatkan 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 di 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. Biarkan M menjadi modul Xi jumlah bit dalam filter, (s * 8).
    ii. Dapatkan byte dalam F pada indeks (M / 8), yang 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" pada nilai ini, karena tidak ada yang lebih atau kurang pentingnya—jangan mengubah urutan byte.

Ladang garam

Salt adalah nilai acak yang ditambahkan ke kunci akun saat membuat filter mekar. Salt ini harus dibuat ulang setiap kali RPA diupdate untuk Penyedia guna menghindari pelacakan di seluruh rotasi alamat.

Untuk membuat Filter Kunci Akun menggunakan salt:

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