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
|
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
|
0bLLLL0000
|
1 - dtk | Filter Kunci Akun | bervariasi | |
s + 1 | uint8 |
Panjang dan jenis kolom 0bLLLLTTTT
|
0b00100001
|
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:
- Misalkan n adalah jumlah kunci akun (n >= 1) dalam Daftar Kunci Akun yang dipertahankan.
- 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);
- Lakukan inisialisasi filter F sebagai array byte s, yang masing-masing ditetapkan ke 0.
uint8_t F[s] = {0};
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:
- 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.
- Gunakan S 2 byte sebagai Salt.
- Dalam Data Akun Sambungan Cepat yang diiklankan, sertakan filter yang dihasilkan di kolom Filter Kunci Akun, dan S di kolom Salt.