Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Notifica batteria
Quando un fornitore include più componenti, può essere utile informare il
Ricerca del livello della batteria di ogni componente. Un esempio potrebbe essere
quando una custodia per auricolari è aperta e il dispositivo di ricerca deve conoscere la batteria per
ogni singolo auricolare e la custodia stessa.
A tal fine, un Fornitore può includere ulteriori informazioni nei
basato sui dati dell'account per l'accoppiamento rapido descritti in
Pubblicità: quando non rilevabile.
Oltre ai Dati dell'account, il Fornitore deve includere un campo aggiuntivo
e specificare i valori della batteria. Il pacchetto deve contenere quanto segue:
Ottetto |
Tipo di dati |
Descrizione |
Valore |
Obbligatorio? |
0 |
uint8 |
Bandiere |
0 x 00 (tutti i bit riservati per uso futuro) |
Obbligatorio |
1 - s |
|
Dati chiave dell'account |
Obbligatorio |
|
S + 1 |
uint8 |
Lunghezza e tipo di livello batteria 0bLLLLTTTT- L = numero di valori della batteria
- T = tipo
|
0bLLLLTTTT
- lunghezza = 0b0011 = 3 valori batteria
- tipo = 0b0011 (mostra indicazione UI) o 0b0100 (nascondi indicazione UI)
|
Facoltativo |
S + 2, S + 3, S + 4 |
uint8 |
Valori batteria 0bSVVVVVVV- S = stato (in carica o non in carica)
- V = valore
- I valori della batteria devono essere ordinati come auricolare sinistro (S + 2), auricolare destro (S + 3) e custodia (S + 4).
|
0bSVVVVVVV
- stato = 0b1 (in carica) o 0b0 (non in carica)
- value = livello della batteria compreso tra 0 e 100%, 0bS1111111 per sconosciuto.
|
Facoltativo |
Per impedire manomissioni, i dati chiave dell'account di cui sopra saranno leggermente
modificato per includere le informazioni sulla batteria quando sono inclusi i valori della batteria
nell'annuncio. Generalmente, durante la creazione della chiave dell'account
, viene generato un valore V combinando l'account
chiave con un sale. Invece, quando vengono pubblicizzate anche le informazioni sulla batteria,
V deve essere costruito come segue:
- Genera un valore V, dove:
.
- I primi 16 byte sono K.
- I byte successivi sono il Salt.
- I byte restanti sono le informazioni sulla batteria (da s + 1 a s + 4
inclusi i byte di lunghezza e tipo della tabella precedente).
Come indicato nel campo relativo a durata e tipo di batteria sopra indicato, il tipo può essere
0b0011
o 0b0100
.
- 0b0011 - Da usare quando il provider vuole che il ricercatore mostri un’indicazione nel
UI dei valori della batteria;
- 0b0100 - Da utilizzare quando il provider vuole che il ricercatore nasconda l’indicazione se
è già visualizzata.
Un caso d'uso comune è l'utilizzo di 0b0011
quando la richiesta è aperta e
0b0100
quando gli auricolari sono stati rimossi dalla custodia o chiusa di nuovo.
//The sample code demonstrates that the headset only reports the battery level.
#define FASTPAIR_ACCOUNT_KEY_SIZE 16
// In the sample code, the size of salt is 2 bytes.
#define SALT_SIZE 2
// 1st byte - Battery level length and type
// 2nd~4th bytes - Battery values
#define BAT_LEVEL_SIZE 3
uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE + BAT_LEVEL_SIZE + 1] = {0};
int v_index = 0;
// The first 16 bytes are K.
uint8_t K[FASTPAIR_ACCOUNT_KEY_SIZE] = {0};
fastpair_get_account_key_by_index(keyIndex, K);
memcpy(V, K, FASTPAIR_ACCOUNT_KEY_SIZE);
v_index = v_index + FASTPAIR_ACCOUNT_KEY_SIZE;
// The next byte is the Salt.
uint8_t randomSalt = (uint8_t)rand();
V[v_index] = randomSalt;
v_index = v_index + SALT_SIZE;
// The remaining bytes are the battery information (from s + 1 to s + 4 including the length and type bytes).
uint8_t battery_level_len = 0;
uint8_t battery_level[BAT_LEVEL_SIZE] = {0};
fastpair_get_bat_level(&battery_level_len, battery_level);
// type = 0b0011 (show UI indication) or 0b0100 (hide UI indication)
V[v_index] = (battery_level_len << 4 | (is_show_ui ? 0x3 : 0x4));
v_index = v_index + 1;
for (int idx = 0; idx < battery_level_len; idx++) {
V[v_index++] = battery_level[idx];
}
Per impedire il tracciamento, il fornitore non deve includere dati non elaborati sulla batteria nella
con la pubblicità. Può invece essere inviato tramite RFCOMM quando connesso a
in cerca di informazioni, consulta Stream di messaggi: Informazioni sul dispositivo.
Salvo quando diversamente specificato, i contenuti di questa pagina sono concessi in base alla licenza Creative Commons Attribution 4.0, mentre gli esempi di codice sono concessi in base alla licenza Apache 2.0. Per ulteriori dettagli, consulta le norme del sito di Google Developers. Java è un marchio registrato di Oracle e/o delle sue consociate.
Ultimo aggiornamento 2025-08-13 UTC.
[[["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\u003eProviders can include battery information for multiple components (e.g., earbuds and case) in the advertisement data using a specific format.\u003c/p\u003e\n"],["\u003cp\u003eThe advertisement data includes battery levels for each component and flags to control UI indication on the Seeker device.\u003c/p\u003e\n"],["\u003cp\u003eTo prevent tampering, the Account Key Data is modified to include battery information, requiring a specific construction process.\u003c/p\u003e\n"],["\u003cp\u003eProviders can choose to show or hide battery information in the Seeker's UI based on user interaction (e.g., case opening/closing).\u003c/p\u003e\n"],["\u003cp\u003eTo prevent tracking, raw battery data should not be constantly advertised but can be sent securely via RFCOMM after connection.\u003c/p\u003e\n"]]],[],null,["### Battery Notification\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\nWhen a Provider includes multiple components, it can be useful to notify the\nSeeker of the battery level for each component. One example of this would be\nwhen a earbuds case is opened and the Seeker needs to know the battery for\neach individual bud and the case itself.\n\nTo accomplish this, a Provider can include additional information in the\nadvertisement, built on top of the Fast Pair Account Data described in\n[Advertising: When not discoverable](/nearby/fast-pair/specifications/service/provider#AdvertisingWhenNotDiscoverable \"Advertizing when not Discoverable\").\n\nIn addition to the Account Data, the Provider should include an additional field\nspecifying the battery values. The packet shall contain the following:\n\n| Octet | Data type | Description | Value | Mandatory? |\n|-----------------------------|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|------------|\n| 0 | `uint8` | Flags | 0x00 (all bits reserved for future use) | Mandatory |\n| 1 - *s* | | Account Key Data | Mandatory | |\n| *s + 1* | `uint8` | Battery level length and type 0bLLLLTTTT - L = Number of battery values - T = type | 0bLLLLTTTT - length = 0b0011 = 3 battery values - type = 0b0011 (show UI indication) or 0b0100 (hide UI indication) | Optional |\n| *s + 2* , *s + 3* , *s + 4* | `uint8` | Battery values 0bSVVVVVVV - S = status (charging or not charging) - V = value - The battery values should be ordered as left bud (*s + 2* ), right bud (*s + 3* ) and case (*s + 4*). | 0bSVVVVVVV - status = 0b1 (charging) or 0b0 (not charging) - value = battery level ranging from 0 to 100 percent, 0bS1111111 for unknown. | Optional |\n\nTo prevent tampering, the Account Key Data above shall be slightly\nmodified to include battery information when the battery values are included\nin the advertisement. Normally, when building the [account key\nfilter](/nearby/fast-pair/specifications/service/provider#AccountKeyFilter \"Account Key Filter\"), a value *V* is produced by combining the account\nkey with a salt. Instead, when battery information is also being advertised, the\nvalue *V* should be constructed as follows:\n\n1. Produce a value *V* , where:\n 1. The first 16 bytes are *K*.\n 2. The next bytes are the [Salt](/nearby/fast-pair/specifications/service/provider#SaltField \"Salt Field\").\n 3. The remaining bytes are the battery information (from *s + 1* to *s + 4* including the length and type byte from the table above).\n\nAs noted in the battery length and type field above, the type can be either\n`0b0011` or `0b0100`.\n\n- 0b0011 - Use when the Provider wants the Seeker to show an indication in the UI of the battery values;\n- 0b0100 - Use when the Provider wants the Seeker to hide the indication if it is already showing.\n\nOne common use case for this is to use `0b0011` when the case has opened and\n`0b0100` when buds have been removed from the case or it has been closed again. \n\n //The sample code demonstrates that the headset only reports the battery level.\n\n #define FASTPAIR_ACCOUNT_KEY_SIZE 16\n\n // In the sample code, the size of salt is 2 bytes.\n #define SALT_SIZE 2\n\n // 1st byte - Battery level length and type\n // 2nd~4th bytes - Battery values\n #define BAT_LEVEL_SIZE 3\n\n uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE + BAT_LEVEL_SIZE + 1] = {0};\n int v_index = 0;\n\n // The first 16 bytes are K.\n uint8_t K[FASTPAIR_ACCOUNT_KEY_SIZE] = {0};\n fastpair_get_account_key_by_index(keyIndex, K);\n memcpy(V, K, FASTPAIR_ACCOUNT_KEY_SIZE);\n v_index = v_index + FASTPAIR_ACCOUNT_KEY_SIZE;\n\n // The next byte is the Salt.\n uint8_t randomSalt = (uint8_t)rand();\n V[v_index] = randomSalt;\n v_index = v_index + SALT_SIZE;\n\n // The remaining bytes are the battery information (from s + 1 to s + 4 including the length and type bytes).\n\n uint8_t battery_level_len = 0;\n uint8_t battery_level[BAT_LEVEL_SIZE] = {0};\n\n fastpair_get_bat_level(&battery_level_len, battery_level);\n\n // type = 0b0011 (show UI indication) or 0b0100 (hide UI indication)\n V[v_index] = (battery_level_len \u003c\u003c 4 | (is_show_ui ? 0x3 : 0x4));\n v_index = v_index + 1;\n\n for (int idx = 0; idx \u003c battery_level_len; idx++) {\n V[v_index++] = battery_level[idx];\n }\n\nTo prevent tracking, the Provider should not include raw battery data in the\nadvertisement all the time. It can instead be sent via RFCOMM when connected to\na Seeker, see [Message Stream: Device Information](/nearby/fast-pair/specifications/extensions/deviceinformation \"Message Stream: Device Information\")."]]