Indicatore annuncio del provider
Pubblicità: quando è rilevabile
Quando il dispositivo fornitore è rilevabile tramite BR/EDR (ovvero in modalità di accoppiamento), pubblicizza i dati dell'ID modello di accoppiamento rapido tramite BLE e l'indirizzo BLE non deve essere ruotato.
Intervallo di pubblicità: quando è rilevabile
L'intervallo tra le pubblicità non deve superare i 100 ms (10 Hz). Una frequenza rapida consente al richiedente di trovare rapidamente il fornitore, anche durante la scansione in modalità a basso consumo energetico.
Payload pubblicitario: dati dell'ID modello Fast Pair
La pubblicità deve contenere il tipo di dati Dati di servizio, ibid., § 1.11. L'UUID
deve essere l'UUID del servizio di accoppiamento rapido di 0xFE2C. I dati di servizio devono
contenere quanto segue:
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0-2 | uint24 |
ID modello a 24 bit | varia |
Payload pubblicitario di condivisione audio LE: dati ID modello di accoppiamento rapido e mappa delle funzionalità di accoppiamento rapido
I dati di servizio devono contenere quanto segue:
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 | uint8 |
Versione e flag 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Lunghezza e tipo di campo 0bLLLLTTTT
|
0bLLLL0111
|
| 2 - s | ID modello | varia | |
| s + 1 | uint8 |
Lunghezza e tipo di campo 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
Mappa delle funzionalità di FP | varia |
Mappa delle funzionalità di FP
La mappa delle funzionalità FP è una bitmap che indica quali funzionalità FP supporta il fornitore. Il primo byte della bitmap è definito come segue:
| Bitmap | Descrizione |
|---|---|
| 0bRRRRRRSO | R - Bit riservato, verrà ignorato per ora dal richiedente e deve essere impostato su 0. S - Supporto della condivisione audio LE FP (impostato su 1 se abilitato, altrimenti su 0). O - Bit Out of Box (OOB), impostato su 1 se il dispositivo è nuovo di fabbrica. |
Se il fornitore supporta la specifica di condivisione audio LE FP (ovvero supporta l'accoppiamento temporaneo, il payload di pubblicità della condivisione audio LE e il controllo degli hearable versione 2), imposta il bit di supporto della condivisione audio LE FP su 1; altrimenti, impostalo su 0.
Se il fornitore non è stato accoppiato con alcun richiedente FP ed è nuovo di fabbrica (ovvero non sono presenti chiavi dell'account FP sul fornitore), imposta il bit OOB su 1; in caso contrario, impostalo su 0.
Pubblicità: quando non è rilevabile
Quando non è rilevabile (ovvero non in modalità di accoppiamento), il dispositivo fornitore deve pubblicizzare i dati dell'account di accoppiamento rapido, utilizzando le seguenti linee guida.
La pubblicità dei dati dell'account consente ai richiedenti nelle vicinanze di riconoscere quando un fornitore appartiene al proprio account e di avviare l'accoppiamento senza dover forzare prima il fornitore in modalità di accoppiamento, il che è una causa comune di reclamo da parte degli utenti. I cercatori offriranno agli utenti la possibilità di ignorare questa trasmissione nel caso in cui non vogliano attendere l'accoppiamento con il fornitore o la trasmissione non sia pertinente (ad esempio, se l'accoppiamento è già avvenuto). Gli utenti che cercano contenuti filtreranno automaticamente anche le trasmissioni ovviamente di scarsa qualità, ad esempio quando i dati dell'account non sono configurati correttamente.
Intervallo di pubblicità: quando non è rilevabile
L'intervallo tra le pubblicità deve essere al massimo di 250 ms (4 Hz).
Payload pubblicitario: dati dell'account per l'accoppiamento rapido
La pubblicità deve contenere il tipo di dati Dati di servizio, Ibid., § 1.11. L'UUID
deve essere l'UUID del servizio di accoppiamento rapido di 0xFE2C. I dati di servizio devono
contenere quanto segue:
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 | uint8 |
Versione e flag 0bVVVVFFFF
|
0x00(riservato per un uso futuro) |
| 1 - varia | Dati della chiave dell'account | varia |
I dati chiave dell'account contengono:
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 | uint8 |
Lunghezza e tipo di campo 0bLLLLTTTT
|
0bLLLL0000
|
| 1 - s | Filtro chiave account | varia | |
| s + 1 | uint8 |
Lunghezza e tipo di campo 0bLLLLTTTT
|
0b00100001
|
| s + 2 - s + 3 | uint16 |
Salt | varia |
Filtro chiave account
Il filtro della chiave dell'account pubblicizzato consente a un richiedente di verificare rapidamente se un fornitore potrebbe possedere una determinata chiave dell'account (con una bassa probabilità di falsi positivi, in media molto inferiore allo 0,5%), prima di ulteriori interazioni. Il Seeker potrebbe connettersi automaticamente e tentare di avviare la procedura quando rileva un filtro trasmesso con tipo 0, ovvero che mostra l'indicazione dell'interfaccia utente, che potenzialmente contiene una delle chiavi del suo account, in modo da ridurre ulteriormente il tasso di falsi positivi. In alcune situazioni, il fornitore potrebbe voler essere riconosciuto dal richiedente senza essere pronto per l'accoppiamento. Un esempio è che quando gli auricolari vengono riposti nella custodia, vogliamo interrompere la visualizzazione della notifica di accoppiamento successiva poiché l'accoppiamento potrebbe essere rifiutato dalle cuffie.
Il filtro della chiave dell'account è un filtro Bloom a lunghezza variabile costruito come segue:
- Sia n il numero di chiavi dell'account (n >= 1) nell'elenco delle chiavi dell'account persistente.
- Sia s la dimensione del filtro in byte, pari a (1, 2*n + 3) troncato. Ad esempio, se viene mantenuta una chiave, s = 4 byte.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - Inizializza il filtro F come array di s byte, ciascuno impostato su 0.
uint8_t F[s] = {0}; Per ogni chiave dell'account K nell'elenco delle chiavi dell'account persistente:
a. Sia V 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. Calcola l'hash V utilizzando SHA256, ottenendo un valore di 32 byte H = {H0, …, H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);c. Dividi H in otto numeri interi senza segno di 4 byte in formato big-endian, X = {X0, …, X7}, dove 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. Per ogni Xi:
i. Sia M il modulo Xi del numero di bit nel filtro, (s * 8).
ii. Ottieni il byte in F all'indice (M / 8), arrotondato per difetto.
iii. All'interno del byte, imposta il bit all'indice (M % 8) su 1.
iv. In altre parole:// 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)); }
Includi il filtro F come campo Filtro chiave account nei dati pubblicitari. Tieni presente che questo valore non ha un ordine dei byte, poiché non esiste un byte più o meno significativo, quindi non modificare l'ordine dei byte.
Campo di sale
Il sale è un valore casuale aggiunto alle chiavi dell'account durante la creazione del filtro Bloom. Questo sale deve essere rigenerato ogni volta che l'RPA viene aggiornato per il fornitore per evitare il monitoraggio durante la rotazione degli indirizzi.
Per generare il filtro della chiave dell'account utilizzando il sale:
- Genera un S casuale di 2 byte. Tieni presente che questo valore non ha un ordine dei byte, poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
- Utilizza S a 2 byte come sale.
- Nei dati dell'account Accoppiamento rapido pubblicizzati, includi il filtro generato nel campo Filtro chiave account e S nel campo Sale.