Thông báo về pin

Khi Nhà cung cấp có nhiều thành phần, bạn nên thông báo cho Trình tìm kiếm về mức pin của từng thành phần. Một ví dụ cho trường hợp này là khi hộp đựng tai nghe mở ra và Người tìm kiếm cần biết pin của từng tai nghe và chính hộp đựng đó.

Để làm được việc này, Nhà cung cấp có thể đưa thông tin bổ sung vào quảng cáo, được xây dựng dựa trên Dữ liệu tài khoản ghép nối nhanh được mô tả trong phần Quảng cáo: Khi không phát hiện được.

Ngoài Dữ liệu tài khoản, Nhà cung cấp phải bao gồm một trường bổ sung trong đó chỉ định các giá trị pin. Gói phải có các nội dung sau:

Bạch tuộc 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 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
s + 1 uint8 Thời lượng và loại mức pin
0bLLLLTTTT
  • L = Số giá trị pin
  • T = loại
0bLLLLTTTT
  • chiều dài = 0b0011 = 3 giá trị pin
  • type = 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ị pin
0bSVVVVVV
  • 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ị của pin là tai nghe trái (s + 2), tai phải (s + 3) và chữ hoa chữ thường (s + 4).
0bSVVVVVV
  • Trạng thái = 0b1 (đang sạc) hoặc 0b0 (không sạc)
  • giá trị = mức pin nằm trong khoảng từ 0 đến 100%, 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ẽ được sửa đổi một chút để bao gồm thông tin về pin khi 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, hệ thống sẽ tạo giá trị V bằng cách kết hợp khoá tài khoản với một dữ liệu ngẫu nhiên. Thay vào đó, khi bạn cũng đang quảng cáo thông tin về pin, giá trị V sẽ đượ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à Salt (Muối).
    3. Các byte còn lại là thông tin về pin (từ s + 1 đến s + 4 bao gồm độ dài và byte loại trong bảng trên).

Như đã lưu ý trong trường thời lượng pin và loại ở trên, loại pin 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 của các giá trị pin;
  • 0b0100 - Sử dụng khi Nhà cung cấp muốn Trình tìm kiếm ẩn chỉ báo nếu nó đã hiển thị.

Một trường hợp sử dụng phổ biến cho trường hợp này là sử dụng 0b0011 khi trường hợp đã mở và 0b0100 khi trường hợp đã được lấy ra khỏi trường hợp hoặc đã đượ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 luôn đưa dữ liệu pin thô vào quảng cáo. Thay vào đó, bạn có thể gửi tin nhắn qua RFCOMM khi được kết nối với một Trình tìm kiếm, hãy xem phần Message Stream: Device Information (Luồng tin nhắn: Thông tin thiết bị).