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

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

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

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

ثُمانِي واحد نوع البيانات الوصف القيمة إلزامي؟
0 uint8 أعلام 0x00
(جميع وحدات البت محجوزة للاستخدام المستقبلي)
إلزامي
1 - ث البيانات الأساسية للحساب إلزامي
s + 1 uint8 نوع مستوى البطارية وطوله
0bLLTTTT
  • L = عدد قيم البطارية
  • T = النوع
0bLLLLTTT
  • الطول = 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. وحدات البايت التالية هي 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 عند الاتصال بأداة بحث، راجع بث الرسائل: معلومات الجهاز.