اعلان باتری

هنگامی که یک ارائه‌دهنده چندین مؤلفه را شامل می‌شود، اطلاع‌رسانی به جستجوگر از سطح باتری هر جزء می‌تواند مفید باشد. یکی از نمونه‌های آن زمانی است که یک قاب هدفون باز می‌شود و جستجوگر باید باتری هر جوانه و خود کیس را بداند.

برای انجام این کار، یک ارائه‌دهنده می‌تواند اطلاعات اضافی را در آگهی اضافه کند، که در بالای داده‌های حساب جفت سریع توضیح داده شده در Advertising: When notable .

علاوه بر داده‌های حساب، ارائه‌دهنده باید یک فیلد اضافی که مقادیر باتری را مشخص می‌کند شامل شود. بسته باید حاوی موارد زیر باشد:

اکتت نوع داده شرح ارزش اجباری؟
0 uint8 پرچم ها 0x00
(همه بیت ها برای استفاده در آینده رزرو شده اند)
اجباری
1 - s داده های کلیدی حساب اجباری
s + 1 uint8 طول و نوع باتری سطح
0bLLLLTTTT
  • L = تعداد مقادیر باتری
  • T = نوع
0bLLLLTTTT
  • طول = 0b0011 = 3 مقدار باتری
  • نوع = 0b0011 (نمایش نشانگر رابط کاربری) یا 0b0100 (پنهان کردن نشانگر رابط کاربری)
اختیاری
s + 2 ، s + 3 ، s + 4 uint8 مقادیر باتری
0bSVVVVVVVV
  • S = وضعیت (در حال شارژ یا عدم شارژ)
  • V = ارزش
  • مقادیر باتری باید به صورت جوانه چپ ( s + 2 )، جوانه سمت راست ( s + 3 ) و مورد ( s + 4 ) مرتب شوند.
0bSVVVVVVVV
  • وضعیت = 0b1 (شارژ) یا 0b0 (شارژ نیست)
  • مقدار = سطح باتری از 0 تا 100 درصد، 0bS1111111 برای ناشناخته.
اختیاری

برای جلوگیری از دستکاری، داده‌های کلید حساب در بالا باید کمی اصلاح شود تا زمانی که مقادیر باتری در آگهی درج می‌شود، اطلاعات باتری درج شود. به طور معمول، هنگام ساخت فیلتر کلید حساب ، مقدار V با ترکیب کلید حساب با یک نمک تولید می شود. در عوض، هنگامی که اطلاعات باتری نیز تبلیغ می شود، مقدار V باید به صورت زیر ساخته شود:

  1. مقدار V را تولید کنید، جایی که:
    1. 16 بایت اول K هستند.
    2. بایت های بعدی Salt هستند.
    3. بایت های باقیمانده اطلاعات باتری هستند (از 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 هنگام اتصال به جستجوگر ارسال کرد، به جریان پیام: اطلاعات دستگاه مراجعه کنید.