Notificación de batería

Cuando un proveedor incluye varios componentes, puede ser útil notificar al usuario que realiza la búsqueda sobre el nivel de batería de cada componente. Un ejemplo sería cuando se abre la funda de los auriculares y Seeker necesita conocer la batería de cada auricular y la funda en sí.

Para lograrlo, un proveedor puede incluir información adicional en el anuncio, basada en los datos de la 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 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
De 1 a s Datos clave de la cuenta Obligatorio
s + 1 uint8 Longitud y tipo del nivel de batería
0bLLLLTTTT
  • L = Cantidad de valores de la batería
  • T = tipo
0bLLLLTTTT
  • length = 0b0011 = 3 valores de batería
  • tipo = 0b0011 (mostrar indicación de IU) o 0b0100 (ocultar indicación de IU)
Opcional
s + 2, s + 3, s + 4 uint8 Valores de la batería
0bSVVVVVVV
  • S = estado (cargando o sin cargar)
  • V = valor
  • Los valores de la batería deben ordenarse como auriculares izquierdo (s + 2), derecho (s + 3) y funda (s + 4).
0bSVVVVVVV
  • estado = 0b1 (cargando) o 0b0 (no cargando)
  • value = nivel de batería de 0 a 100%, 0bS1111111 para un valor desconocido.
Opcional

A fin de evitar alteraciones, los datos de la clave de la cuenta mencionados anteriormente se modificarán ligeramente para incluir información sobre la batería cuando los valores de esta se incluyan en el anuncio. Por lo general, cuando se compila el filtro de clave de cuenta, se produce un valor V combinando la clave de cuenta con una sal. En cambio, cuando también se anuncia información sobre la batería, el valor V debe construirse de la siguiente manera:

  1. Produce una V, en la que sucede lo siguiente:
    1. Los primeros 16 bytes son K.
    2. Los siguientes bytes son la sal.
    3. Los bytes restantes corresponden a la información de la batería (desde s + 1 hasta s + 4, lo que incluye la longitud y el tipo de byte 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 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 está mostrando.

Un caso de uso común es usar 0b0011 cuando se abrió la funda y 0b0100 cuando se quitaron los auriculares de la funda o se cerró nuevamente.

  //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 cambio, se puede enviar a través de RFCOMM cuando se conecta a un Seeker. Consulta Flujo de mensajes: Información del dispositivo.