Notification concernant la batterie

Lorsqu'un fournisseur inclut plusieurs composants, il peut être utile d'informer le demandeur du niveau de batterie de chaque composant. C'est le cas, par exemple, lorsqu'un étui d'écouteurs est ouvert et que le Seeker doit connaître la batterie de chaque écouteur et l'étui lui-même.

Pour ce faire, un fournisseur peut inclure des informations supplémentaires dans l'annonce, basées sur les données de compte Association express décrites dans la section Publicité: Lorsqu'elle n'est pas visible.

En plus des données de compte, le fournisseur doit inclure un champ supplémentaire spécifiant les valeurs de la batterie. Le paquet doit contenir les éléments suivants:

Octet Type de données Description Valeur Obligatoire ?
0 uint8 Options 0x00
(tous les bits réservés pour une utilisation future)
Obligatoire
1 – s Données de clé de compte Obligatoire
s + 1 uint8 Longueur et type de batterie
0bLLLLTTTT
  • L = Nombre de valeurs de la batterie
  • T = type
0bLLLLTTTT
  • longueur = 0b0011 = 3 valeurs de la batterie
  • type = 0b0011 (afficher l'indication de l'interface utilisateur) ou 0b0100 (masquer l'indication de l'interface utilisateur)
Facultatif
s + 2, s + 3, s + 4 uint8 Valeurs de la batterie
0bSVVVVVVV
  • S = état (en charge ou non en charge)
  • V = valeur
  • Les valeurs de la batterie doivent être classées selon l'écouteur gauche (s + 2), l'écouteur droit (s + 3) et l'étui (s + 4).
0bSVVVVVVV
  • état = 0b1 (en charge) ou 0b0 (pas en charge)
  • valeur = niveau de la batterie compris entre 0 et 100 pour cent, 0bS1111111 pour inconnu.
Facultatif

Pour éviter toute falsification, les données de clé de compte ci-dessus doivent être légèrement modifiées afin d'inclure les informations sur la batterie lorsque les valeurs de la batterie sont incluses dans l'annonce. Normalement, lors de la création du filtre de clé de compte, une valeur V est générée en combinant la clé de compte avec un salage. À la place, lorsque des informations sur la batterie sont également annoncées, la valeur V doit être construite comme suit:

  1. Génère une valeur V, où :
    1. Les 16 premiers octets correspondent à K.
    2. Les octets suivants sont le Salt.
    3. Les octets restants sont les informations sur la batterie (de s + 1 à s + 4, y compris l'octet de longueur et de type de la table ci-dessus).

Comme indiqué dans le champ de type et de longueur de batterie ci-dessus, le type peut être 0b0011 ou 0b0100.

  • 0b0011 : à utiliser lorsque le fournisseur souhaite que le demandeur affiche une indication sur les valeurs de la batterie dans l'interface utilisateur.
  • 0b0100 : à utiliser lorsque le fournisseur souhaite que le chercheur masque l'indication si elle s'affiche déjà.

Un cas d'utilisation courant consiste à utiliser 0b0011 lorsque l'étui est ouvert et 0b0100 lorsque les écouteurs ont été retirés de l'étui ou qu'il a été à nouveau fermé.

  //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];
  }

Pour empêcher le suivi, le fournisseur ne doit pas constamment inclure de données brutes sur la batterie dans l'annonce. Il peut plutôt être envoyé via RFCOMM lorsque vous êtes connecté à un chercheur. Consultez la section Flux de messages: informations provenant des appareils.