اعلان باتری
هنگامی که یک ارائهدهنده چندین مؤلفه را شامل میشود، اطلاعرسانی به جستجوگر از سطح باتری هر جزء میتواند مفید باشد. یکی از نمونههای آن زمانی است که یک قاب هدفون باز میشود و جستجوگر باید باتری هر جوانه و خود کیس را بداند.
برای انجام این کار، یک ارائهدهنده میتواند اطلاعات اضافی را در آگهی اضافه کند، که در بالای دادههای حساب جفت سریع توضیح داده شده در Advertising: When notable .
علاوه بر دادههای حساب، ارائهدهنده باید یک فیلد اضافی که مقادیر باتری را مشخص میکند شامل شود. بسته باید حاوی موارد زیر باشد:
اکتت | نوع داده | توضیحات | ارزش | اجباری؟ |
---|---|---|---|---|
0 | uint8 | پرچم ها | 0x00 (همه بیت ها برای استفاده در آینده رزرو شده اند) | اجباری |
1 - s | داده های کلیدی حساب | اجباری | ||
s + 1 | uint8 | طول و نوع باتری سطح 0bLLLLTTTT
| 0bLLLLTTTT
| اختیاری |
s + 2 ، s + 3 ، s + 4 | uint8 | مقادیر باتری 0bSVVVVVVVV
| 0bSVVVVVVVV
| اختیاری |
برای جلوگیری از دستکاری، دادههای کلید حساب در بالا باید کمی اصلاح شود تا زمانی که مقادیر باتری در آگهی درج میشود، اطلاعات باتری درج شود. به طور معمول، هنگام ساخت فیلتر کلید حساب ، مقدار V با ترکیب کلید حساب با یک نمک تولید می شود. در عوض، هنگامی که اطلاعات باتری نیز تبلیغ می شود، مقدار V باید به صورت زیر ساخته شود:
- مقدار V را تولید کنید، جایی که:
- 16 بایت اول K هستند.
- بایت های بعدی Salt هستند.
- بایت های باقیمانده اطلاعات باتری هستند (از s + 1 تا s + 4 شامل طول و نوع بایت از جدول بالا).
همانطور که در قسمت طول و نوع باتری در بالا ذکر شد، نوع آن می تواند 0b0011
یا 0b0100
باشد.
- 0b0011 - زمانی استفاده می شود که ارائه دهنده می خواهد جستجوگر نشانه ای از مقادیر باتری را در UI نشان دهد.
- 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];
}
برای جلوگیری از ردیابی، ارائهدهنده نباید دادههای خام باتری را همیشه در آگهی وارد کند. در عوض میتوان از طریق RFCOMM هنگام اتصال به جستجوگر ارسال کرد، به جریان پیام: اطلاعات دستگاه مراجعه کنید.