Уведомление о батарее

Когда поставщик включает в себя несколько компонентов, может быть полезно уведомить Искателя об уровне заряда батареи для каждого компонента. Одним из примеров этого может быть случай, когда чехол для наушников открыт, и Искателю необходимо знать аккумулятор для каждого отдельного наушника и сам чехол.

Для этого Поставщик может включить в рекламу дополнительную информацию, созданную на основе данных учетной записи Fast Pair, описанных в разделе «Реклама: когда невозможно обнаружить» .

В дополнение к данным учетной записи Провайдер должен включить дополнительное поле с указанием значений заряда батареи. Пакет должен содержать следующее:

Октет Тип данных Описание Ценить Обязательный?
0 uint8 Флаги 0x00
(все биты зарезервированы для использования в будущем)
Обязательный
1 - с Ключевые данные учетной записи Обязательный
с + 1 uint8 Длина и тип уровня заряда батареи
0bLLLLTTTT
  • L = количество значений батареи
  • Т = тип
0bLLLLTTTT
  • длина = 0b0011 = 3 значения батареи
  • type = 0b0011 (показать индикацию пользовательского интерфейса) или 0b0100 (скрыть индикацию пользовательского интерфейса)
Необязательный
с + 2 , с + 3 , с + 4 uint8 Значения батареи
0bSVVVVVVV
  • S = статус (заряжается или не заряжается)
  • В = значение
  • Параметры батарей следует упорядочивать как левый наушник ( s + 2 ), правый наушник ( s + 3 ) и корпус ( s + 4 ).
0bSVVVVVVV
  • статус = 0b1 (заряжается) или 0b0 (не заряжается)
  • значение = уровень заряда батареи в диапазоне от 0 до 100 процентов, 0bS1111111 — неизвестно.
Необязательный

Чтобы предотвратить несанкционированный доступ, приведенные выше данные ключа учетной записи должны быть слегка изменены, чтобы включить информацию о батарее, когда значения батареи включены в рекламу. Обычно при построении фильтра ключа учетной записи значение V создается путем объединения ключа учетной записи с солью. Вместо этого, когда также объявляется информация о батарее, значение V должно быть построено следующим образом:

  1. Создайте значение V , где:
    1. Первые 16 байт — это K.
    2. Следующие байты — это Salt .
    3. Остальные байты — это информация о батарее (от s+1 до s+4 , включая байты длины и типа из таблицы выше).

Как указано выше в поле длины и типа батареи, тип может быть 0b0011 или 0b0100 .

  • 0b0011 — используйте, когда Провайдер хочет, чтобы Искатель показывал в пользовательском интерфейсе значения заряда батареи;
  • 0b0100 — используйте, когда Провайдер хочет, чтобы Искатель скрыл индикацию, если она уже отображается.

Одним из распространенных вариантов использования этого является использование 0b0011 когда корпус открыт, и 0b0100 , когда бутоны были удалены из корпуса или он снова был закрыт.

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

Во избежание отслеживания Поставщик не должен постоянно включать в рекламу необработанные данные об аккумуляторе. Вместо этого его можно отправить через RFCOMM при подключении к Seeker, см. Поток сообщений: информация об устройстве .