Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Indicatore pubblicità del fornitore
Pubblicità: quando è rilevabile
Quando il dispositivo del fornitore è rilevabile BR/EDR (ovvero in modalità di accoppiamento), deve pubblicizzare 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 gli annunci non deve superare 100 ms (10 Hz). Una frequenza elevata consente al cercatore di trovare rapidamente il fornitore, anche durante la scansione in modalità a basso consumo.
Payload della pubblicità: dati ID modello di accoppiamento rapido
L'annuncio deve contenere il tipo di dati Dati di servizio, ivi incluso, § 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
Pubblicità: quando non è rilevabile
Quando non è rilevabile (ovvero non è in modalità di accoppiamento), il dispositivo del fornitore deve pubblicizzare i dati dell'account per l'accoppiamento rapido, utilizzando le seguenti linee guida.
La pubblicità dei dati dell'account consente ai Cercatori nelle vicinanze di riconoscere quando un fornitore appartiene al loro account e di avviare l'accoppiamento senza dover prima forzare il fornitore a tornare in modalità di accoppiamento, che è una causa comune dei reclami degli utenti. I cercatori daranno la possibilità agli utenti di ignorare questa trasmissione nel caso in cui non aspettino di accoppiarsi con il fornitore o se la trasmissione non è pertinente (ad esempio, se hanno già eseguito l'accoppiamento).
I ricercatori filtreranno automaticamente anche le trasmissioni chiaramente errate, ad esempio quando i dati dell'account sono configurati in modo errato.
Intervallo di pubblicità: quando non è rilevabile
L'intervallo tra gli annunci deve essere di massimo 250 ms (4 Hz).
Payload pubblicitario: dati dell'account per l'accoppiamento rapido
L'annuncio 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
V = versione
F = flags
0x00 (riservato per un uso futuro)
1 - varia
Dati della chiave dell'account
varia
I dati della chiave dell'account contengono:
Ottetto
Tipo di dati
Descrizione
Valore
0
uint8
Lunghezza e tipo di campo 0bLLLLTTTT
L = lunghezza del filtro della chiave dell'account in byte
T = tipo
0bLLLL0000
length = 0bLLLL = varies
type = 0b0000 (mostra l'indicazione UI) o 0b0010 (nascondi l'indicazione UI), Filtro chiavi account
Il filtro della chiave dell'account pubblicizzata consente a un cercatore 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 cercatore 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 alcuni casi, il fornitore potrebbe voler essere riconosciuto dal cercatore anche se non è pronto per l'accoppiamento. Un esempio è che quando gli auricolari vengono rimessi nella custodia, vogliamo interrompere la visualizzazione della notifica di accoppiamento successiva, poiché l'accoppiamento potrebbe essere rifiutato dall'auricolare.
Il filtro delle chiavi dell'account è un
filtro Bloom di lunghezza variabile costituito come segue:
Sia n il numero di chiavi dell'account (n >= 1) nell'elenco Chiave account persistente.
Sia s, le dimensioni del filtro in byte, pari a (1,2*n + 3) troncato. Ad esempio, se una chiave è persistente, s = 4 byte. uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
Inizializza il filtro F come un array di s byte, ciascuno impostato su 0. uint8_t F[s] = {0};
// In the sample code, the size of salt is 2 bytes.#define SALT_SIZE 2uint8_tV[FASTPAIR_ACCOUNT_KEY_SIZE+SALT_SIZE];for(uint8_tkeyIndex=0;keyIndex < n;keyIndex++){// concat (K, Salt)fastpair_get_account_key_by_index(keyIndex,V);uint8_trandomSalt=(uint8_t)rand();V[FASTPAIR_ACCOUNT_KEY_SIZE]=randomSalt;...}
b. Esegui l'hash di V utilizzando SHA256, ottenendo un valore di 32 byte H =
{H0, …, H31}.
uint8_tH[32]={0};SHA256_hash_function(V,H);
c. Dividi H in otto numeri interi non firmati di 4 byte in big endian,
X = {X0, …, X7}, dove
X0 = 0xH0H1H2H3.
d. Per ogni Xi:
i. Sia MXi modulo il numero di bit nel filtro,
(s * 8).
ii. Recupera 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_tM=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 "endianness", poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
Salina
Il sale è un valore casuale che viene 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 di 2 byte casuale. Tieni presente che questo valore non ha un "endianness", poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
Utilizza S di 2 byte come il sale.
Nei dati dell'account di accoppiamento rapido pubblicizzati, includi il filtro generato nel
campo Filtro chiave account e S nel campo Sale.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-08-13 UTC."],[[["\u003cp\u003eProvider devices advertise Fast Pair Model ID Data over BLE when in pairing mode to enable quick discovery by Seeker devices.\u003c/p\u003e\n"],["\u003cp\u003eWhen not discoverable, Provider devices advertise Fast Pair Account Data, allowing Seekers to recognize them and initiate pairing without requiring the Provider to re-enter pairing mode.\u003c/p\u003e\n"],["\u003cp\u003eThe Account Key Filter, a Bloom filter included in the Account Key Data, helps Seekers quickly assess the potential presence of a specific account key on the Provider, reducing false positives and unnecessary pairing attempts.\u003c/p\u003e\n"],["\u003cp\u003eThe salt, a random value appended to account keys during Bloom filter construction, is regenerated with each Provider RPA update to prevent tracking across address rotations, enhancing privacy.\u003c/p\u003e\n"]]],[],null,["Provider Advertising signal\n---------------------------\n\n### Advertising: When discoverable\n\nWhen the Provider device is BR/EDR discoverable (that is, in pairing mode), it\nshall advertise Fast Pair Model ID Data over BLE, and the BLE address shall not\nbe rotated.\n\n#### Advertising interval: When discoverable\n\nThe interval between advertisements should be no larger than 100ms (10Hz). A\nfast rate allows the Seeker to quickly find the Provider, even when scanning in\nlow-power mode.\n\n#### Advertising payload: Fast Pair Model ID Data\n\nThe advertisement shall contain the Service Data data type, ibid., § 1.11. The\nUUID shall be the Fast Pair Service UUID of `0xFE2C`. The service data shall\ncontain the following:\n\n| Octet | Data type | Description | Value |\n|-------|-----------|-----------------|----------|\n| 0-2 | `uint24` | 24-bit model ID | *varies* |\n\n### Advertising: When not discoverable\n\nWhen not discoverable (that is, not in pairing mode), the Provider device shall\nadvertise Fast Pair Account Data, using the following guidelines.\n\nAdvertising the account data allows Seekers nearby to recognize when a provider\nbelongs to their account and initiate pairing without having to force the\nprovider back into pairing mode first, which is a common cause for user\ncomplaint. Seekers will provide the opportunity for users to be able to ignore\nthis broadcast in the case where they do not wait to pair with the provider or\nthe broadcast is not relevant (for example, if they have already paired).\nSeekers will also filter out obviously bad broadcasts automatically, such as\nwhen the account data is misconfigured.\n\n#### Advertising interval: When not discoverable\n\nThe interval between advertisements should be at most 250ms (4Hz).\n\n#### Advertising payload: Fast Pair Account Data\n\nThe advertisement shall contain the Service Data data type, Ibid., § 1.11. The\nUUID shall be the Fast Pair Service UUID of `0xFE2C`. The service data shall\ncontain the following:\n\n| Octet | Data type | Description | Value |\n|--------------|-----------|--------------------------------------------------------|----------------------------------|\n| 0 | `uint8` | Version and flags 0bVVVVFFFF - V = version - F = flags | `0x00` (reserved for future use) |\n| 1 - *varies* | | Account Key Data | *varies* |\n\n| **Note:** The provider shall advertise its Fast PairAccount Data only if the Account Key List has one or more entries.\n\nThe Account Key Data contains:\n\n| Octet | Data type | Description | Value |\n|-------------------|-----------|-----------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|\n| 0 | `uint8` | Field length and type 0bLLLLTTTT - L = length of account key filter in bytes - T = type | 0bLLLL0000 - length = 0bLLLL = *varies* - type = 0b0000 (show UI indication) or 0b0010 (hide UI indication), Account Key Filter |\n| 1 - *s* | | Account Key Filter | *varies* |\n| *s* + 1 | `uint8` | Field length and type 0bLLLLTTTT - L = length in bytes - T = type | 0b00100001 - length = 0b0010 = 2 - type = 0b0001, [Salt](#SaltField) |\n| *s* + 2 - *s* + 3 | `uint16` | Salt | *varies* |\n\n#### Account Key Filter\n\n| **Note:** Google recommends implementing the [Cryptographic Test Cases](/nearby/fast-pair/specifications/appendix/cryptotestcases \"Link to the Cryptographic Test Cases.\") to ease verification of these requirements.\n\nThe advertised Account Key Filter allows a Seeker to quickly check whether a\nProvider might possess a certain account key (with a low false-positive\nprobability, on average much less than 0.5%), before further interactions. The\nSeeker may automatically connect and attempt to start the procedure when it sees\na filter being broadcast with type 0, i.e. showing UI indication, that\npotentially contains one of its account keys, so as to reduce the rate of false\npositives further. In some situations, the Provider may want to be recognized\nby the Seeker while not ready for pairing. One example is that when buds get put\nback into case, we want to stop showing the subsequent pairing notification\nsince that pairing could be rejected by the headset.\n\nThe Account Key Filter is a variable-length\n[Bloom filter](https://en.wikipedia.org/wiki/Bloom_filter) constructed as\nfollows:\n\n1. Let *n* be the number of account keys (*n* \\\u003e= 1) in the persisted [Account Key list](/nearby/fast-pair/specifications/configuration#AccountKeyList \"Account Key List\").\n2. Let *s* , the size of the filter in bytes, be (1.2\\**n* + 3) truncated. For example, if 1 key is persisted, *s* = 4 bytes. \n `uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);`\n3. Initialize the filter *F* as an array of *s* bytes, each set to 0. \n `uint8_t F[s] = {0};`\n4. For each account key *K* in the persisted [Account Key list](/nearby/fast-pair/specifications/configuration#AccountKeyList \"Account Key List\"): \n\n a. Let *V* be concat(*K* , [Salt](#SaltField)). \n\n // In the sample code, the size of salt is 2 bytes.\n #define SALT_SIZE 2\n\n uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE];\n for (uint8_t keyIndex = 0; keyIndex \u003c n; keyIndex++)\n {\n // concat (K, Salt)\n fastpair_get_account_key_by_index(keyIndex, V);\n\n uint8_t randomSalt = (uint8_t)rand();\n V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt;\n ... }\n\n b. Hash *V* using SHA256, obtaining a 32-byte value *H* =\n {H~0~, ..., H~31~}. \n\n uint8_t H[32] = {0};\n SHA256_hash_function(V, H);\n\n c. Divide *H* into eight 4-byte unsigned integers in big-endian,\n X = {X~0~, ..., X~7~}, where\n X~0~ = 0xH~0~H~1~H~2~H~3~. \n\n uint32_t X[8];\n for (index = 0; index \u003c 8; index++)\n {\n X[index] = (((uint32_t)(H[index * 4])) \u003c\u003c 24) |\n (((uint32_t)(H[index * 4 + 1])) \u003c\u003c 16) |\n (((uint32_t)(H[index * 4 + 2])) \u003c\u003c 8) |\n (((uint32_t)(H[index * 4 + 3])) \u003c\u003c 0);\n }\n\n d. For each X~i~: \n\n i. Let *M* be *X~i~* modulo the number of bits in the filter,\n (*s* \\* 8). \n\n ii. Get the byte in *F* at index (*M* / 8), rounded down. \n\n iii. Within the byte, set the bit at index (*M* % 8) to 1. \n\n iv. In other words: \n\n // M = Xi % (s * 8)\n // F[M/8] = F[M/8] | (1 \u003c\u003c (M % 8))\n for (index = 0; index \u003c 8; index++)\n {\n uint32_t M = X[index] % (s * 8);\n F[M / 8] = F[M / 8] | (1 \u003c\u003c (M % 8));\n }\n\nInclude the filter *F* as the Account Key Filter field, in the advertising data.\nNote that there is no \"endianness\" to this value, since there is no more or less\nsignificant byte---don't alter the byte order.\n\n##### Salt field\n\nThe salt is a random value that is appended to account keys when building the\nbloom filter. This salt should be regenerated every time the RPA is updated for\nthe Provider to avoid tracking across address rotation.\n\nTo generate the Account Key Filter using the salt:\n\n1. Generate a random 2-byte *S*. Note that there is no \"endianness\" to this value, since there is no more or less significant byte --- don't alter the byte order.\n2. Use the 2-byte *S* as the Salt.\n3. In the advertised Fast Pair Account Data, include the generated filter in the Account Key Filter field, and *S* in the Salt field."]]