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
  • L = Số giá trị pin
  • T = loại
0bLLLLTTTT
  • chiều dài = 0b0011 = 3 giá trị pin
  • loại = 0b0011 (hiển thị chỉ báo giao diện người dùng) hoặc 0b0100 (ẩn chỉ báo giao diện người dùng)
Không bắt buộc
s + 2, s + 3, s + 4 uint8 Giá trị của pin
0bSVVVVVVV
  • S = trạng thái (đang sạc hoặc không sạc)
  • V = giá trị
  • Bạn nên sắp xếp các giá trị pin theo tai nghe trái (s + 2), tai nghe phải (s + 3) và tai nghe (s + 4).
0bSVVVVVVV
  • Trạng thái = 0b1 (đang sạc) hoặc 0b0 (không sạc)
  • giá trị = mức pin từ 0 đến 100 phần trăm, 0bS1111111 nếu không xác định.
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:

  1. Tạo một giá trị V, trong đó:
    1. 16 byte đầu tiên là K.
    2. Các byte tiếp theo là muối.
    3. 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ị.