Notificação de bateria

Quando um provedor inclui vários componentes, pode ser útil notificar o Seeker sobre o nível de bateria de cada componente. Um exemplo disso seria quando um estojo para fones de ouvido é aberto e o Seeker precisa saber o nível de bateria de cada fone e do estojo.

Para isso, um provedor pode incluir mais informações no anúncio, com base nos dados da conta do pareamento rápido descritos em Publicidade: quando não é detectável.

Além dos dados da conta, o provedor precisa incluir um campo adicional especificando os valores da bateria. O pacote precisa conter o seguinte:

Octet Tipo de dado Descrição Valor Obrigatório?
0 uint8 Sinalizações 0x00
(todos os bits reservados para uso futuro)
Obrigatório
1 - s Dados da chave da conta Obrigatório
s + 1 uint8 Nível de bateria, comprimento e tipo
0bLLLLTTTT
  • L = número de valores de bateria
  • T = tipo
0bLLLLTTTT
  • length = 0b0011 = 3 valores de bateria
  • type = 0b0011 (mostrar indicação da interface) ou 0b0100 (ocultar indicação da interface)
Opcional
s + 2, s + 3, s + 4 uint8 Valores da bateria
0bSVVVVVVV
  • S = status (carregando ou não carregando)
  • V = valor
  • Os valores da bateria precisam ser ordenados como fone esquerdo (s + 2), fone direito (s + 3) e estojo (s + 4).
0bSVVVVVVV
  • status = 0b1 (carregando) ou 0b0 (não carregando)
  • value = Nível de bateria variando de 0 a 100%, 0bS1111111 para desconhecido.
Opcional

Para evitar adulterações, os dados da chave da conta acima serão ligeiramente modificados para incluir informações da bateria quando os valores dela forem incluídos no anúncio. Normalmente, ao criar o filtro de chave da conta, um valor V é produzido combinando a chave da conta com um salt. Em vez disso, quando as informações da bateria também são anunciadas, o valor V precisa ser construído da seguinte maneira:

  1. Produza um valor V, em que:
    1. Os primeiros 16 bytes são K.
    2. Os próximos bytes são o Salt.
    3. Os bytes restantes são as informações da bateria (de s + 1 a s + 4, incluindo o byte de comprimento e tipo da tabela acima).

Conforme observado no campo "Comprimento e tipo da bateria" acima, o tipo pode ser 0b0011 ou 0b0100.

  • 0b0011: use quando o provedor quiser que o solicitante mostre uma indicação na interface dos valores da bateria.
  • 0b0100 - Use quando o provedor quiser que o solicitante oculte a indicação se ela já estiver aparecendo.

Um caso de uso comum é usar 0b0011 quando o estojo é aberto e 0b0100 quando os buds são removidos do estojo ou ele é fechado novamente.

  //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 o rastreamento, o provedor não deve incluir dados brutos de bateria no anúncio o tempo todo. Em vez disso, ela pode ser enviada pelo Message Stream quando conectada a um Seeker. Consulte Message Stream: informações do dispositivo.