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
|
0x00 |
| 1 | uint8 |
Panjang dan jenis kolom 0bLLLLTTTT
|
0bLLLL0111
|
| 2 - s | ID Model | berbeda-beda | |
| s + 1 | uint8 |
Panjang dan jenis kolom 0bLLLLTTTT
|
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
|
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
|
0bLLLL0000
|
| 1 - s | Filter Kunci Akun | berbeda-beda | |
| s + 1 | uint8 |
Panjang dan jenis kolom 0bLLLLTTTT
|
0b00100001
|
| 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:
- 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 dipangkas. Misalnya, jika 1 kunci dipertahankan, s = 4 byte.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - Inisialisasi filter F sebagai array s byte, 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. 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:
- 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.