Notificación de batería
Cuando un proveedor incluye varios componentes, puede resultar útil notificar al usuario sobre el nivel de batería de cada componente. Un ejemplo de esto sería cuando los fundas estén abiertos y los auriculares, que necesitan saber la batería de cada auricular y la funda.
Para lograrlo, un proveedor puede incluir información adicional en el anuncio, creada a partir de los datos de la cuenta de vinculación rápida descritos 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 deberá contener lo siguiente:
Octeta | Tipo de dato | Descripción | Valor | ¿Obligatorio? |
---|---|---|---|---|
0 | uint8 |
Marcas | 0x00 (todos los bits reservados para uso futuro) |
Obligatorio |
1: s | Datos clave de la cuenta | Obligatorio | ||
s + 1 | uint8 |
Longitud y tipo de nivel de la batería 0bLLLLTTT
|
0bLLLLTTT
|
Opcional |
s + 2, s + 3, s + 4 | uint8 |
Valores de la batería 0bSVVVVVVV
|
0bSVVVVVVV
|
Opcional |
A fin de evitar alteraciones, la información de la clave de la cuenta que se indicó antes debe modificarse levemente para incluir información sobre la batería cuando estos se incluyan en el anuncio. Por lo general, cuando se compila el filtro de clave de cuenta, se produce un valor V cuando se combina la clave de cuenta con una sal. En cambio, cuando también se anuncia información sobre la batería, se debe construir el valor V de la siguiente manera:
- Produce un valor V, en el que:
- Los primeros 16 bytes son K.
- Los siguientes bytes son los Salt.
- Los bytes restantes son información sobre las baterías (de s + 1 a s + 4, incluidos la longitud y el byte del tipo de la tabla anterior).
Como se indicó en el campo de duración de la batería y el tipo anterior, el tipo puede ser 0b0011
o 0b0100
.
- 0b0011: Se usa cuando el proveedor desea que el buscador muestre una indicación en la IU de los valores de la batería.
- 0b0100: Se usa cuando el proveedor desea que el buscador oculte la indicación si ya se muestra.
Un caso práctico común es usar 0b0011
cuando se abre el caso y 0b0100
cuando se quitan los auriculares 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 la batería sin procesar en el anuncio todo el tiempo. En su lugar, se puede enviar a través de RFCOMM cuando se conecta a un usuario. Consulta Flujo de mensajes: información del dispositivo.