התראה לגבי הסוללה
כשספק כולל כמה רכיבים, כדאי להודיע למשתמש על רמת הסוללה של כל רכיב. דוגמה לכך היא כשפותחים את נרתיק האוזניות, והמכשיר שולח בקשה לדעת את מצב הסוללה של כל אוזניית כפתור ושל הנרתיק עצמו.
כדי לעשות את זה, ספק יכול לכלול מידע נוסף בפרסום, על סמך נתוני החשבון של התכונה 'התאמה מהירה' שמתוארים במאמר פרסום: כשלא ניתן לגלות את האוזניות.
בנוסף לנתוני החשבון, הספק צריך לכלול שדה נוסף שמציין את ערכי הסוללה. החבילה צריכה להכיל את הנתונים הבאים:
| Octet | סוג הנתונים | תיאור | ערך | חובה? |
|---|---|---|---|---|
| 0 | uint8 |
דגלים | 0x00 (כל הביטים שמורים לשימוש עתידי) |
חובה |
| 1 – s | נתונים של מפתח החשבון | חובה | ||
| s + 1 | uint8 |
אורך וסוג של רמת הטעינה של הסוללה 0bLLLLTTTT
|
0bLLLLTTTT
|
אופציונלי |
| s + 2, s + 3, s + 4 | uint8 |
ערכי סוללה 0bSVVVVVVV
|
0bSVVVVVVV
|
אופציונלי |
כדי למנוע שיבוש, נתוני מפתח החשבון שלמעלה ישונו מעט כדי לכלול פרטי סוללה, אם ערכי הסוללה כלולים בפרסום. בדרך כלל, כשיוצרים את המסנן של מפתח החשבון, נוצר ערך V על ידי שילוב של מפתח החשבון עם מלח. במקום זאת, אם מפורסמים גם פרטי סוללה, צריך ליצור את הערך V באופן הבא:
- מפיקים ערך V, כאשר:
- 16 הבייטים הראשונים הם 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];
}
כדי למנוע מעקב, הספק לא צריך לכלול נתוני סוללה גולמיים בפרסום כל הזמן. במקום זאת, אפשר לשלוח את הנתונים דרך Message Stream כשהמכשיר מחובר ל-Seeker. מידע נוסף זמין במאמר Message Stream: Device Information.