Thông báo về pin
Khi một Trình cung cấp có nhiều thành phần, bạn nên thông báo cho Người tìm kiếm về mức pin của từng thành phần. Một ví dụ về trường hợp này là khi hộp đựng tai nghe được mở và Thiết bị tìm kiếm cần biết pin của từng tai nghe và hộp sạc.
Để thực hiện việc này, Nhà cung cấp có thể thêm thông tin bổ sung vào quảng cáo, dựa trên Dữ liệu tài khoản Ghép nối nhanh như mô tả trong phần Quảng cáo: Khi không thể phát hiện.
Ngoài Dữ liệu tài khoản, Nhà cung cấp phải thêm một trường khác để chỉ định các giá trị pin. Gói này phải có những nội dung sau:
| Octet | Loại dữ liệu | Mô tả | Giá trị | Bắt buộc? |
|---|---|---|---|---|
| 0 | uint8 |
Cờ | 0x00 (tất cả các bit dành để sử dụng trong tương lai) |
Bắt buộc |
| 1 – s | Dữ liệu khoá tài khoản | Bắt buộc | ||
| s + 1 | uint8 |
Độ dài và loại mức pin 0bLLLLTTTT
|
0bLLLLTTTT
|
Không bắt buộc |
| s + 2, s + 3, s + 4 | uint8 |
Giá trị pin 0bSVVVVVVV
|
0bSVVVVVVV
|
Không bắt buộc |
Để ngăn chặn hành vi giả mạo, Dữ liệu khoá tài khoản ở trên sẽ được sửa đổi một chút để bao gồm thông tin về pin khi các giá trị pin được đưa vào quảng cáo. Thông thường, khi tạo bộ lọc khoá tài khoản, một giá trị V sẽ được tạo bằng cách kết hợp khoá tài khoản với một chuỗi ngẫu nhiên. Thay vào đó, khi bạn cũng quảng cáo thông tin về pin, giá trị V phải được tạo như sau:
- Tạo ra một giá trị V, trong đó:
- 16 byte đầu tiên là K.
- Các byte tiếp theo là Salt.
- Các byte còn lại là thông tin về pin (từ s + 1 đến s + 4, bao gồm cả byte chiều dài và loại trong bảng ở trên).
Như đã lưu ý trong trường loại và độ dài pin ở trên, loại pin có thể là 0b0011 hoặc 0b0100.
- 0b0011 – Sử dụng khi Nhà cung cấp muốn Người tìm kiếm cho biết giá trị pin trong giao diện người dùng;
- 0b0100 – Sử dụng khi Nhà cung cấp muốn Người tìm kiếm ẩn chỉ báo nếu chỉ báo đó đã xuất hiện.
Một trường hợp sử dụng phổ biến cho sự kiện này là dùng 0b0011 khi hộp đã mở và 0b0100 khi tai nghe đã được tháo ra khỏi hộp hoặc hộp đã đóng lại.
//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];
}
Để ngăn chặn việc theo dõi, Nhà cung cấp không nên luôn đưa dữ liệu thô về pin vào quảng cáo. Thay vào đó, dữ liệu này có thể được gửi qua Luồng thông báo khi kết nối với một Người tìm kiếm, hãy xem Luồng thông báo: Thông tin thiết bị.