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