Sinyal Iklan Penyedia
Iklan: Saat dapat ditemukan
Jika perangkat Penyedia dapat ditemukan BR/EDR (yaitu, dalam mode penyambungan), perangkat harus mengiklankan Data ID Model Sambungan Cepat daripada BLE, dan alamat BLE tidak akan diputar.
Interval iklan: Saat dapat ditemukan
Interval antar-iklan tidak boleh lebih dari 100 md (10 Hz). J tingkat yang cepat memungkinkan Pencari untuk menemukan Penyedia dengan cepat, bahkan saat memindai mode daya rendah.
Payload iklan: Data ID Model Sambungan Cepat
Iklan harus berisi jenis data Data Layanan, ibid., § 1.11. Tujuan
UUID akan menjadi 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: Saat tidak dapat ditemukan
Saat tidak dapat ditemukan (yaitu, tidak dalam mode penyambungan), perangkat Penyedia harus mengiklankan Data Akun Sambungan Cepat, menggunakan panduan berikut.
Mengiklankan data akun memungkinkan Pencari Kerja di sekitar mengenali saat penyedia milik akun mereka dan memulai pasangan tanpa harus memaksa penyedia kembali ke mode penyambungan terlebih dahulu, yang merupakan penyebab umum keluhan Anda. Pencari kerja akan memberikan peluang bagi pengguna untuk mengabaikan siaran ini dalam kasus di mana mereka tidak menunggu untuk menyambungkan dengan penyedia siaran tersebut tidak relevan (misalnya, jika sudah dipasangkan). Pencari juga akan otomatis menyaring siaran yang jelas-jelas buruk, seperti saat data akun salah dikonfigurasi.
Interval iklan: Saat tidak dapat ditemukan
Interval antar-iklan maksimal harus 250 md (4 Hz).
Payload iklan: Data Akun Sambungan Cepat
Iklan harus berisi jenis data Data Layanan, Ibid., § 1.11. Tujuan
UUID akan menjadi UUID Layanan Sambungan Cepat 0xFE2C
. Data layanan harus
berisi hal berikut:
Oktet | Jenis data | Deskripsi | Nilai |
---|---|---|---|
0 | uint8 |
Versi dan tanda 0bVVVVFFFF
|
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 0bLLLLTTTT
|
0bLLLL0.000
|
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 Kerja untuk memeriksa dengan cepat apakah Penyedia mungkin memiliki kunci akun tertentu (dengan positif palsu rendah probabilitas tertinggi, rata-rata kurang dari 0,5%), sebelum interaksi lebih lanjut. Tujuan Pencari dapat otomatis terhubung dan mencoba memulai prosedur saat melihat filter yang disiarkan dengan tipe 0, yaitu menunjukkan indikasi UI, yang berpotensi berisi salah satu kunci akunnya, untuk mengurangi tingkat informasi positif lebih lanjut. Dalam beberapa situasi, Penyedia mungkin ingin dikenali oleh Pencari Kerja ketika belum siap untuk pemasangan. Salah satu contohnya adalah ketika tunas diletakkan kembali ke kasus, kita ingin berhenti menampilkan notifikasi penyambungan berikutnya karena penyandingan itu dapat ditolak oleh {i>headset<i}.
Filter Kunci Akun memiliki panjang variabel Filter bunga dibuat sebagai berikut ini:
- Misalkan n adalah jumlah kunci akun (n >= 1) dalam Daftar Kunci Akun.
- Mari s, ukuran filter dalam byte, dipotong (1.2*n + 3). Sebagai
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, masing-masing disetel 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, untuk memperoleh nilai 32 byte H = {H0, ..., T31}.
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 = 0xH0T1T2T3.
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 menjadi Xi berdasarkan jumlah bit dalam filter, (dtk * 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, pada data iklan. Perhatikan bahwa tidak ada "{i>endianness<i}" ke nilai ini, karena tidak ada lebih banyak atau lebih sedikit byte yang signifikan—jangan mengubah urutan byte.
Ladang garam
Salt adalah nilai acak yang ditambahkan ke kunci akun saat membangun {i>bloom filter<i}. {i>Salt<i} ini harus dibuat ulang setiap kali RPA diperbarui untuk Penyedia untuk menghindari pelacakan di seluruh rotasi alamat.
Untuk membuat Filter Kunci Akun menggunakan salt:
- Buat S 2 byte secara acak. Perhatikan bahwa tidak ada "{i>endianness<i}" menjadi , karena tidak ada byte yang lebih atau kurang signifikan — jangan ubah byte pesanan.
- Gunakan S 2 byte sebagai Salt.
- Dalam Data Akun Sambungan Cepat yang diiklankan, sertakan filter yang dihasilkan dalam kolom Kolom Filter Kunci Akun, dan S pada kolom Salt.