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

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

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

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

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

כדי למנוע פגיעה, נתוני מפתח החשבון שצוינו למעלה יהיו מעט שונה כדי לכלול מידע על הסוללה כשערכי הסוללה כלולים בפרסומת. בדרך כלל, כשיוצרים את מפתח החשבון מסנן, הערך V נוצר על ידי שילוב החשבון. מפתח עם מלח. במקום זאת, כשמפרסמים גם מידע על הסוללה, הערך 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 כשהוא מחובר אל משתמשים שמחפשים מבצעים זמינות בקטע זרם הודעות: מידע מהמכשירים שלך.