Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
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:
- 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ị.
Trừ phi có lưu ý khác, nội dung của trang này được cấp phép theo Giấy phép ghi nhận tác giả 4.0 của Creative Commons và các mẫu mã lập trình được cấp phép theo Giấy phép Apache 2.0. Để biết thông tin chi tiết, vui lòng tham khảo Chính sách trang web của Google Developers. Java là nhãn hiệu đã đăng ký của Oracle và/hoặc các đơn vị liên kết với Oracle.
Cập nhật lần gần đây nhất: 2025-08-13 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-08-13 UTC."],[[["\u003cp\u003eProviders can include battery information for multiple components (e.g., earbuds and case) in the advertisement data using a specific format.\u003c/p\u003e\n"],["\u003cp\u003eThe advertisement data includes battery levels for each component and flags to control UI indication on the Seeker device.\u003c/p\u003e\n"],["\u003cp\u003eTo prevent tampering, the Account Key Data is modified to include battery information, requiring a specific construction process.\u003c/p\u003e\n"],["\u003cp\u003eProviders can choose to show or hide battery information in the Seeker's UI based on user interaction (e.g., case opening/closing).\u003c/p\u003e\n"],["\u003cp\u003eTo prevent tracking, raw battery data should not be constantly advertised but can be sent securely via RFCOMM after connection.\u003c/p\u003e\n"]]],[],null,["### Battery Notification\n\n| **Note:** Google recommends implementing the [Cryptographic Test Cases](/nearby/fast-pair/specifications/appendix/cryptotestcases \"Link to the Cryptographic Test Cases.\") to ease verification of these requirements.\n\nWhen a Provider includes multiple components, it can be useful to notify the\nSeeker of the battery level for each component. One example of this would be\nwhen a earbuds case is opened and the Seeker needs to know the battery for\neach individual bud and the case itself.\n\nTo accomplish this, a Provider can include additional information in the\nadvertisement, built on top of the Fast Pair Account Data described in\n[Advertising: When not discoverable](/nearby/fast-pair/specifications/service/provider#AdvertisingWhenNotDiscoverable \"Advertizing when not Discoverable\").\n\nIn addition to the Account Data, the Provider should include an additional field\nspecifying the battery values. The packet shall contain the following:\n\n| Octet | Data type | Description | Value | Mandatory? |\n|-----------------------------|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|------------|\n| 0 | `uint8` | Flags | 0x00 (all bits reserved for future use) | Mandatory |\n| 1 - *s* | | Account Key Data | Mandatory | |\n| *s + 1* | `uint8` | Battery level length and type 0bLLLLTTTT - L = Number of battery values - T = type | 0bLLLLTTTT - length = 0b0011 = 3 battery values - type = 0b0011 (show UI indication) or 0b0100 (hide UI indication) | Optional |\n| *s + 2* , *s + 3* , *s + 4* | `uint8` | Battery values 0bSVVVVVVV - S = status (charging or not charging) - V = value - The battery values should be ordered as left bud (*s + 2* ), right bud (*s + 3* ) and case (*s + 4*). | 0bSVVVVVVV - status = 0b1 (charging) or 0b0 (not charging) - value = battery level ranging from 0 to 100 percent, 0bS1111111 for unknown. | Optional |\n\nTo prevent tampering, the Account Key Data above shall be slightly\nmodified to include battery information when the battery values are included\nin the advertisement. Normally, when building the [account key\nfilter](/nearby/fast-pair/specifications/service/provider#AccountKeyFilter \"Account Key Filter\"), a value *V* is produced by combining the account\nkey with a salt. Instead, when battery information is also being advertised, the\nvalue *V* should be constructed as follows:\n\n1. Produce a value *V* , where:\n 1. The first 16 bytes are *K*.\n 2. The next bytes are the [Salt](/nearby/fast-pair/specifications/service/provider#SaltField \"Salt Field\").\n 3. The remaining bytes are the battery information (from *s + 1* to *s + 4* including the length and type byte from the table above).\n\nAs noted in the battery length and type field above, the type can be either\n`0b0011` or `0b0100`.\n\n- 0b0011 - Use when the Provider wants the Seeker to show an indication in the UI of the battery values;\n- 0b0100 - Use when the Provider wants the Seeker to hide the indication if it is already showing.\n\nOne common use case for this is to use `0b0011` when the case has opened and\n`0b0100` when buds have been removed from the case or it has been closed again. \n\n //The sample code demonstrates that the headset only reports the battery level.\n\n #define FASTPAIR_ACCOUNT_KEY_SIZE 16\n\n // In the sample code, the size of salt is 2 bytes.\n #define SALT_SIZE 2\n\n // 1st byte - Battery level length and type\n // 2nd~4th bytes - Battery values\n #define BAT_LEVEL_SIZE 3\n\n uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE + BAT_LEVEL_SIZE + 1] = {0};\n int v_index = 0;\n\n // The first 16 bytes are K.\n uint8_t K[FASTPAIR_ACCOUNT_KEY_SIZE] = {0};\n fastpair_get_account_key_by_index(keyIndex, K);\n memcpy(V, K, FASTPAIR_ACCOUNT_KEY_SIZE);\n v_index = v_index + FASTPAIR_ACCOUNT_KEY_SIZE;\n\n // The next byte is the Salt.\n uint8_t randomSalt = (uint8_t)rand();\n V[v_index] = randomSalt;\n v_index = v_index + SALT_SIZE;\n\n // The remaining bytes are the battery information (from s + 1 to s + 4 including the length and type bytes).\n\n uint8_t battery_level_len = 0;\n uint8_t battery_level[BAT_LEVEL_SIZE] = {0};\n\n fastpair_get_bat_level(&battery_level_len, battery_level);\n\n // type = 0b0011 (show UI indication) or 0b0100 (hide UI indication)\n V[v_index] = (battery_level_len \u003c\u003c 4 | (is_show_ui ? 0x3 : 0x4));\n v_index = v_index + 1;\n\n for (int idx = 0; idx \u003c battery_level_len; idx++) {\n V[v_index++] = battery_level[idx];\n }\n\nTo prevent tracking, the Provider should not include raw battery data in the\nadvertisement all the time. It can instead be sent via RFCOMM when connected to\na Seeker, see [Message Stream: Device Information](/nearby/fast-pair/specifications/extensions/deviceinformation \"Message Stream: Device Information\")."]]