Notifikasi Baterai
Jika Penyedia menyertakan beberapa komponen, sebaiknya beri tahu Pencari tentang level baterai untuk setiap komponen. Salah satu contohnya adalah saat casing earbud dibuka dan Seeker perlu mengetahui baterai untuk setiap earbud dan casing itu sendiri.
Untuk melakukannya, Penyedia dapat menyertakan informasi tambahan dalam iklan, yang dibuat di atas Data Akun Fast Pair yang dijelaskan dalam Iklan: Jika tidak dapat ditemukan.
Selain Data Akun, Penyedia harus menyertakan kolom tambahan yang menentukan nilai baterai. Paket harus berisi hal berikut:
| Octet | Jenis data | Deskripsi | Nilai | Wajib? |
|---|---|---|---|---|
| 0 | uint8 |
Tanda | 0x00 (semua bit dicadangkan untuk penggunaan di masa mendatang) |
Wajib |
| 1 - dtk | Data Kunci Akun | Wajib | ||
| s + 1 | uint8 |
Panjang dan jenis level baterai 0bLLLLTTTT
|
0bLLLLTTTT
|
Opsional |
| s + 2, s + 3, s + 4 | uint8 |
Nilai baterai 0bSVVVVVVV
|
0bSVVVVVVV
|
Opsional |
Untuk mencegah pemalsuan, Data Kunci Akun di atas harus sedikit dimodifikasi untuk menyertakan informasi baterai jika nilai baterai disertakan dalam iklan. Biasanya, saat membuat filter kunci akun, nilai V dihasilkan dengan menggabungkan kunci akun dengan salt. Namun, jika informasi baterai juga diiklankan, nilai V harus dibuat sebagai berikut:
- Menghasilkan nilai V, dengan:
- 16 byte pertama adalah K.
- Byte berikutnya adalah Salt.
- Byte yang tersisa adalah informasi baterai (dari s + 1 hingga s + 4 termasuk byte panjang dan jenis dari tabel di atas).
Seperti yang disebutkan di kolom panjang dan jenis baterai di atas, jenisnya dapat berupa
0b0011 atau 0b0100.
- 0b0011 - Digunakan saat Penyedia ingin Pencari menampilkan indikasi nilai baterai di UI;
- 0b0100 - Gunakan saat Penyedia ingin Pencari menyembunyikan indikasi jika sudah ditampilkan.
Salah satu kasus penggunaan umum untuk hal ini adalah menggunakan 0b0011 saat casing telah dibuka dan 0b0100 saat earbud telah dikeluarkan dari casing atau casing telah ditutup kembali.
//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 setiap saat. Sebagai gantinya, data ini dapat dikirim melalui Aliran Pesan saat terhubung ke Seeker, lihat Aliran Pesan: Informasi Perangkat.