התראה על הסוללה

כשהספק כולל מספר רכיבים, כדאי להודיע למחפש לגבי רמת הטעינה של כל רכיב. דוגמה לכך היא פתיחה של נרתיק של אוזניות כפתור, והמחפש צריך לדעת את מצב הסוללה של כל אוזנייה בנפרד והנרתיק עצמו.

לשם כך, הספק יכול לכלול במודעה מידע נוסף, שמבוסס על נתוני החשבון בהתאמה מהירה המתוארים בקטע פרסום: כשלא ניתן לגלות.

בנוסף לנתוני החשבון, הספק צריך לכלול שדה נוסף שבו מפורטים ערכי הסוללה. החבילה תכיל את הפרטים הבאים:

8 תווים סוג הנתונים תיאור ערך חובה?
0 uint8 דגלים 0x00
(כל הביטים שמורים לשימוש עתידי)
חובה
1 – s נתוני מפתח של החשבון חובה
s + 1 uint8 אורך וסוג רמת הטעינה של הסוללה
0bLLLLTTTT
  • L = מספר ערכי הסוללה
  • T = סוג
0bLLLLTTTT
  • אורך = 0b0011 = 3 ערכי סוללה
  • type = 0b0011 (הצגת אינדיקציה בממשק המשתמש) או 0b0100 (הסתרת אינדיקציה בממשק המשתמש)
אופציונלי
s + 2, s + 3, s + 4 uint8 ערכי סוללה
0bSVVVVVVV
  • S = סטטוס (בטעינה או לא)
  • V = ערך
  • ערכי הסוללה צריכים להיות בסדר של אוזנייה שמאלית (s + 2), אוזנייה ימנית (s + 3) ונרתיק (s + 4).
0bSVVVVVVV
  • סטטוס = 0b1 (טעינה) או 0b0 (לא בטעינה)
  • ערך = רמת הטעינה של הסוללה נעה בין 0 ל-100 אחוזים, 0bS1111111 עבור מצב לא ידוע.
אופציונלי

כדי למנוע פגיעה, נתוני המפתח של החשבון שלמעלה ישתנו מעט כך שיכללו מידע על הסוללה כשערכי הסוללה יופיעו בפרסומת. בדרך כלל, כשיוצרים את המסנן של מפתח החשבון, נוצר ערך V על ידי שילוב מפתח החשבון עם salt. במקום זאת, כשמפרסמים גם את פרטי הסוללה, יש ליצור את הערך V באופן הבא:

  1. מזינים את הערך V, כאשר:
    1. 16 הבייטים הראשונים הם K.
    2. הבייטים הבאים הם ערכי Salt.
    3. הבייטים הנותרים הם נתוני הסוללה (מ-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];
  }

כדי למנוע מעקב, הספק לא אמור לכלול כל הזמן בפרסום נתונים גולמיים של הסוללה. אפשר לשלוח אותו דרך RFCOMM כשהוא מחובר למחפש, בקטע Message Stream: Device Information.