إشعار البطارية

عندما يتضمّن "مزوّد الخدمة" مكوّنات متعدّدة، قد يكون من المفيد إشعار "الباحث" بمستوى البطارية لكل مكوّن. أحد الأمثلة على ذلك هو عندما يتم فتح حافظة سمّاعات الأذن ويحتاج "الباحث" إلى معرفة مستوى شحن البطارية لكل سمّاعة على حدة والحافظة نفسها.

لتحقيق ذلك، يمكن أن يتضمّن "مزوّد الخدمة" معلومات إضافية في الـ إعلان، استنادًا إلى "بيانات الحساب" في ميزة "الاقتران السريع" الموضّحة في مقالة الإعلان: عندما لا يكون الجهاز قابلاً للاكتشاف.

بالإضافة إلى "بيانات الحساب"، يجب أن يتضمّن "مزوّد الخدمة" حقلاً إضافيًا يحدّد قيم البطارية. يجب أن تحتوي الحزمة على ما يلي:

ثُمانِي واحد نوع البيانات الوصف القيمة إلزامي؟
0 uint8 أعلام 0x00
(جميع وحدات البت محجوزة للاستخدام في المستقبل)
إلزامي
1 - s بيانات مفتاح الحساب إلزامي
s + 1 uint8 طول ونوع مستوى البطارية
0bLLLLTTTT
  • L = عدد قيم البطارية
  • T = النوع
0bLLLLTTTT
  • الطول = 0b0011 = 3 قيم للبطارية
  • النوع = 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 من خلال الجمع بين مفتاح الحساب و"الملح". بدلاً من ذلك، عندما يتم الإعلان أيضًا عن معلومات البطارية، يجب إنشاء القيمة V على النحو التالي:

  1. إنشاء قيمة V، حيث:
    1. أول 16 بايت هي K.
    2. البايتات التالية هي "الملح".
    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];
  }

لمنع التتبّع، يجب ألا يتضمّن "مزوّد الخدمة" بيانات البطارية الأولية في الإعلان طوال الوقت. بدلاً من ذلك، يمكن إرسالها عبر "بث الرسائل" عند الاتصال بـ "باحث"، يمكنك الاطّلاع على مقالة بث الرسائل: معلومات الجهاز.