Notificación de batería
Cuando un proveedor incluye varios componentes, puede ser útil notificar al buscador el nivel de batería de cada componente. Un ejemplo de esto sería cuando se abre un estuche de auriculares y el buscador necesita saber la batería de cada auricular y del estuche.
Para lograr esto, un proveedor puede incluir información adicional en el anuncio, que se basa en los datos de la cuenta de Vinculación rápida que se describen en Publicidad: Cuando no se puede detectar.
Además de los datos de la cuenta, el proveedor debe incluir un campo adicional que especifique los valores de la batería. El paquete debe contener lo siguiente:
| Octeto | Tipo de datos | Descripción | Valor | ¿Obligatorio? |
|---|---|---|---|---|
| 0 | uint8 |
Marcas | 0x00 (todos los bits reservados para uso futuro) |
Obligatorio |
| 1 - s | Datos de la clave de la cuenta | Obligatorio | ||
| s + 1 | uint8 |
Longitud y tipo del nivel de batería 0bLLLLTTTT
|
0bLLLLTTTT
|
Opcional |
| s + 2, s + 3, s + 4 | uint8 |
Valores de batería 0bSVVVVVVV
|
0bSVVVVVVV
|
Opcional |
Para evitar la manipulación, los datos de la clave de la cuenta anteriores se modificarán ligeramente para incluir información de la batería cuando los valores de la batería se incluyan en el anuncio. Por lo general, cuando se compila el filtro de clave de la cuenta, se produce un valor V combinando la clave de la cuenta con una sal. En cambio, cuando también se anuncia información de la batería, el valor V debe construirse de la siguiente manera:
- Produce un valor V, donde:
- Los primeros 16 bytes son K.
- Los siguientes bytes son la sal.
- Los bytes restantes son la información de la batería (de s + 1 a s + 4, incluidos los bytes de longitud y tipo de la tabla anterior).
Como se indicó en el campo de longitud y tipo de batería anterior, el tipo puede ser 0b0011 o 0b0100.
- 0b0011: Se usa cuando el proveedor quiere que el buscador muestre una indicación en la IU de los valores de la batería.
- 0b0100: Se usa cuando el proveedor quiere que el buscador oculte la indicación si ya se muestra.
Un caso de uso común para esto es usar 0b0011 cuando se abre el estuche y 0b0100 cuando se quitan los auriculares del estuche o se vuelve a cerrar.
//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];
}
Para evitar el seguimiento, el proveedor no debe incluir datos de batería sin procesar en el anuncio todo el tiempo. En su lugar, se puede enviar a través de Message Stream cuando se conecta a un buscador. Consulta Message Stream: Información del dispositivo.