Notificación de batería
Cuando un proveedor incluye varios componentes, puede ser útil notificar al Busca el nivel de batería de cada componente. Un ejemplo de esto sería cuando se abre la funda de los auriculares y el Seeker necesita conocer el nivel de batería del cada auricular y la funda en sí.
Para lograr esto, un Proveedor puede incluir información adicional en la basada en los datos de cuenta de Vinculación rápida que se describen en Publicidad: Cuando no es detectable.
Además de los Datos de la Cuenta, el Proveedor debe incluir un campo adicional especificando 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 clave de la cuenta | Obligatorio | ||
s + 1 | uint8 |
Tipo y longitud de la batería 0bLLTTTT
|
0bLLTTTT
|
Opcional |
s + 2, s + 3, s + 4 | uint8 |
Valores de la batería 0bSVVVVVVV
|
0bSVVVVVVV
|
Opcional |
Para evitar la manipulación, los Datos clave de la cuenta anteriores deben ser ligeramente se modificarán para incluir información sobre la batería cuando se incluyan sus valores en el anuncio. Normalmente, al crear la clave de la cuenta filtro, se produce un valor V combinando la cuenta con una sal. Cuando también se anuncia información sobre la batería, el el valor V debe construirse de la siguiente manera:
- Genera un valor V, en el que:
- 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). incluida la longitud y el tipo de byte de la tabla anterior).
Como se indica en el campo de tipo y longitud de la batería anterior, el tipo puede ser de
0b0011
o 0b0100
.
- 0b0011: Úsalo cuando el proveedor quiere que el buscador muestre una indicación en la IU de los valores de batería
- 0b0100: Úsalo cuando el proveedor quiere que el buscador oculte la indicación si corresponde. ya se muestra.
Un caso de uso común es usar 0b0011
cuando el caso se abrió y
0b0100
cuando se hayan quitado los auriculares de la funda o se vuelvan 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 seguimientos, el Proveedor no debe incluir datos sin procesar sobre la batería en el todo el tiempo. En su lugar, se puede enviar a través de RFCOMM cuando está conectado a un buscador, consulta Flujo de mensajes: Información del dispositivo.