Notifikasi Baterai

Jika Penyedia menyertakan beberapa komponen, sebaiknya beri tahu Pencarian tentang level baterai untuk setiap komponen. Salah satu contohnya adalah saat casing earbud dibuka dan Pencari perlu mengetahui baterai untuk setiap bud dan casing itu sendiri.

Untuk melakukannya, Penyedia dapat menyertakan informasi tambahan dalam iklan, yang dibuat berdasarkan Data Akun Sambungan Cepat yang dijelaskan dalam Iklan: Saat tidak dapat ditemukan.

Selain Data Akun, Penyedia harus menyertakan kolom tambahan yang menentukan nilai baterai. Paket tersebut akan berisi hal berikut:

Oktet Jenis data Deskripsi Nilai Wajib?
0 uint8 Tanda 0x00
(semua bit dicadangkan untuk penggunaan mendatang)
Wajib
1 - d Data Kunci Akun Wajib
s + 1 uint8 Panjang dan jenis level baterai
0bLLTTTT
  • L = Jumlah nilai baterai
  • T = jenis
0bLLTTTT
  • panjang = 0b0011 = 3 nilai baterai
  • type = 0b0011 (tampilkan indikasi UI) atau 0b0100 (sembunyikan indikasi UI)
Opsional
s + 2, s + 3, s + 4 uint8 Nilai baterai
0bSVVVVVVV
  • S = status (mengisi daya atau tidak mengisi daya)
  • V = nilai
  • Nilai baterai harus diurutkan sebagai bud kiri (s + 2), bud kanan (s + 3), dan casing (s + 4).
0bSVVVVVVV
  • status = 0b1 (mengisi daya) atau 0b0 (tidak mengisi daya)
  • nilai = level baterai berkisar dari 0 hingga 100 persen, 0bS1111111 untuk tidak diketahui.
Opsional

Untuk mencegah modifikasi, Data Kunci Akun di atas harus sedikit dimodifikasi untuk menyertakan informasi baterai saat nilai baterai disertakan dalam iklan. Biasanya, saat membuat filter kunci akun, nilai V akan dihasilkan dengan menggabungkan kunci akun dengan salt. Sebagai gantinya, jika informasi baterai juga diiklankan, nilai V harus dibuat sebagai berikut:

  1. Berikan nilai V, dengan:
    1. 16 byte pertama adalah K.
    2. Byte berikutnya adalah Salt.
    3. Byte yang tersisa adalah informasi baterai (dari s + 1 hingga s + 4 termasuk panjang dan jenis byte dari tabel di atas).

Seperti yang disebutkan dalam kolom jenis dan panjang baterai di atas, jenisnya dapat berupa 0b0011 atau 0b0100.

  • 0b0011 - Gunakan saat Penyedia ingin Pencari Kerja menampilkan indikasi di UI nilai baterai;
  • 0b0100 - Gunakan saat Penyedia ingin Pencari Kerja menyembunyikan indikasi jika indikasi sudah ditampilkan.

Salah satu kasus penggunaan yang umum untuk hal ini adalah menggunakan 0b0011 saat casing terbuka dan 0b0100 saat buds dikeluarkan dari casing atau telah ditutup lagi.

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

Untuk mencegah pelacakan, Penyedia tidak boleh menyertakan data baterai mentah dalam iklan sepanjang waktu. Sebagai gantinya, pesan dapat dikirim melalui RFCOMM saat terhubung ke Pencari Kerja. Lihat Aliran Pesan: Informasi Perangkat.