اعلان باتری
وقتی یک ارائهدهنده شامل چندین قطعه است، میتواند مفید باشد که به جستجوگر میزان باتری هر قطعه را اطلاع دهد. یک مثال از این مورد زمانی است که یک قاب هدفون باز میشود و جستجوگر باید باتری هر هدفون و خود قاب را بداند.
برای دستیابی به این هدف، ارائهدهنده میتواند اطلاعات اضافی را در تبلیغات بگنجاند، که بر اساس دادههای حساب جفتسازی سریع (Fast Pair Account Data) که در بخش «تبلیغات: وقتی قابل کشف نیست» توضیح داده شده است، ساخته شده است.
علاوه بر اطلاعات حساب، ارائه دهنده باید یک فیلد اضافی که مقادیر باتری را مشخص میکند، اضافه کند. این بسته باید شامل موارد زیر باشد:
| هشتتایی | نوع داده | توضیحات | ارزش | اجباری؟ |
|---|---|---|---|---|
| 0 | uint8 | پرچمها | 0x00 (تمام بیتها برای استفادههای بعدی رزرو شدهاند) | اجباری |
| ۱ - ثانیه | دادههای کلیدی حساب | اجباری | ||
| ها + ۱ | uint8 | طول و نوع سطح باتری عالی
| عالی
| اختیاری |
| ها + ۲ ، ها + ۳ ، ها + ۴ | uint8 | مقادیر باتری ۰bSVVVVVVV
| ۰bSVVVVVVV
| اختیاری |
برای جلوگیری از دستکاری، دادههای کلید حساب کاربری بالا باید کمی اصلاح شوند تا اطلاعات باتری را نیز در هنگام درج مقادیر باتری در اعلان، شامل شوند. معمولاً هنگام ساخت فیلتر کلید حساب کاربری ، مقدار V با ترکیب کلید حساب کاربری با یک Salt تولید میشود. در عوض، هنگامی که اطلاعات باتری نیز اعلان میشود، مقدار V باید به صورت زیر ساخته شود:
- مقدار V را تولید کنید، که در آن:
- ۱۶ بایت اول K هستند.
- بایتهای بعدی Salt هستند.
- بایتهای باقیمانده اطلاعات باتری هستند (از s + 1 تا s + 4 شامل بایت طول و نوع از جدول بالا).
همانطور که در فیلد طول و نوع باتری در بالا ذکر شد، نوع میتواند 0b0011 یا 0b0100 باشد.
- 0b0011 - زمانی استفاده میشود که ارائهدهنده میخواهد جستجوگر در رابط کاربری، نشانگری از مقادیر باتری را نشان دهد؛
- 0b0100 - زمانی استفاده میشود که ارائهدهنده میخواهد جستجوگر، اگر از قبل نشان داده شده است، آن را پنهان کند.
یکی از کاربردهای رایج این روش، استفاده از 0b0011 در هنگام باز شدن محفظه و 0b0100 در هنگام خارج کردن هدفونها از محفظه یا بسته شدن مجدد آن است.
//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];
}
برای جلوگیری از ردیابی، ارائهدهنده نباید همیشه دادههای خام باتری را در تبلیغات خود قرار دهد. در عوض، میتواند هنگام اتصال به یک جستجوگر، از طریق جریان پیام ارسال شود، به جریان پیام: اطلاعات دستگاه مراجعه کنید.