Akkubenachrichtigung

Wenn ein Anbieter mehrere Komponenten hat, kann es hilfreich sein, den Suchenden über den Akkustand für jede Komponente zu informieren. Ein Beispiel dafür ist, wenn ein Kopfhörer-Case geöffnet ist und der Nutzer den Akku für jeden einzelnen Kopfhörer und das Case selbst wissen muss.

Zu diesem Zweck kann ein Anbieter zusätzliche Informationen in das Advertising einbinden, die auf den Kontodaten für schnelles Pairing aufbaut, die unter Werbung: Wenn nicht sichtbar beschrieben wird.

Zusätzlich zu den Kontodaten sollte der Anbieter ein zusätzliches Feld mit den Akkuwerten hinzufügen. Das Paket muss Folgendes enthalten:

Oktett Datentyp Beschreibung Wert Obligatorisch?
0 uint8 Flags 0 x 00
(alle Bits für die zukünftige Verwendung reserviert)
Erforderlich
1–Sek. Kontoschlüsseldaten Erforderlich
S + 1 uint8 Länge und Typ des Akkuladestands
0bLLLLTTTT
  • L = Anzahl der Batteriewerte
  • T = Typ
0bLLLLTTT
  • Länge = 0b0011 = 3 Batteriewerte
  • type = 0b0011 (Benutzeroberflächenanzeige anzeigen) oder 0b0100 (Benutzeroberflächenanzeige ausblenden)
Optional
s + 2, s + 3, s + 4 uint8 Akkuwerte
0bSVVVVVVV
  • S = Status (wird geladen oder wird nicht geladen)
  • V = Wert
  • Die Akkuwerte sollten als linker Kopfhörer (s + 2), rechter Kopfhörer (s + 3) und Case (s + 4) angeordnet werden.
0bSVVVVVVV
  • status = 0b1 (wird geladen) oder 0b0 (wird nicht geladen)
  • value = Akkustand zwischen 0 und 100 %, 0bS1111111 für unbekannt.
Optional

Um Manipulationsversuche zu verhindern, sollten die oben stehenden Kontoschlüsseldaten leicht geändert werden, sodass sie auch Akkuinformationen enthalten, wenn die Akkuwerte in der Anzeige zu sehen sind. Beim Erstellen des Kontoschlüsselfilters wird normalerweise der Wert V durch Kombination des Kontoschlüssels mit einem Salt erzeugt. Wenn stattdessen auch Akkuinformationen beworben werden, sollte der Wert V so erstellt werden:

  1. Erzeugen Sie einen Wert V, wobei Folgendes gilt:
    1. Die ersten 16 Byte sind K.
    2. Die nächsten Byte sind Salt.
    3. Die verbleibenden Byte sind die Akkuinformationen (von s + 1 bis s + 4 einschließlich des Längen- und Typbyte aus der obigen Tabelle).

Wie oben im Feld „Akkulänge und -typ“ angegeben, kann der Typ entweder 0b0011 oder 0b0100 sein.

  • 0b0011 – Verwenden, wenn der Anbieter möchte, dass der Suchende auf der Benutzeroberfläche einen Hinweis auf die Akkuwerte anzeigt;
  • 0b0100 – Wird verwendet, wenn der Anbieter möchte, dass der Suchende den Hinweis ausblendet, wenn er bereits angezeigt wird.

Ein häufiger Anwendungsfall dafür ist 0b0011, wenn das Case geöffnet wurde, und 0b0100, wenn die Kopfhörer aus dem Case entfernt oder wieder geschlossen wurden.

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

Um das Tracking zu verhindern, sollte der Anbieter nicht ständig unbearbeitete Akkudaten in die Werbung aufnehmen. Sie kann stattdessen über RFCOMM gesendet werden, wenn eine Verbindung mit einem Seeker besteht. Siehe Message Stream: Geräteinformationen.