إشعار البطارية
عندما يتضمّن "مزوّد الخدمة" مكوّنات متعدّدة، قد يكون من المفيد إشعار "الباحث" بمستوى البطارية لكل مكوّن. أحد الأمثلة على ذلك هو عندما يتم فتح حافظة سمّاعات الأذن ويحتاج "الباحث" إلى معرفة مستوى شحن البطارية لكل سمّاعة على حدة والحافظة نفسها.
لتحقيق ذلك، يمكن أن يتضمّن "مزوّد الخدمة" معلومات إضافية في الـ إعلان، استنادًا إلى "بيانات الحساب" في ميزة "الاقتران السريع" الموضّحة في مقالة الإعلان: عندما لا يكون الجهاز قابلاً للاكتشاف.
بالإضافة إلى "بيانات الحساب"، يجب أن يتضمّن "مزوّد الخدمة" حقلاً إضافيًا يحدّد قيم البطارية. يجب أن تحتوي الحزمة على ما يلي:
| ثُمانِي واحد | نوع البيانات | الوصف | القيمة | إلزامي؟ |
|---|---|---|---|---|
| 0 | uint8 |
أعلام | 0x00 (جميع وحدات البت محجوزة للاستخدام في المستقبل) |
إلزامي |
| 1 - s | بيانات مفتاح الحساب | إلزامي | ||
| s + 1 | uint8 |
طول ونوع مستوى البطارية 0bLLLLTTTT
|
0bLLLLTTTT
|
اختياري |
| s + 2، s + 3، s + 4 | uint8 |
قيم البطارية 0bSVVVVVVV
|
0bSVVVVVVV
|
اختياري |
لمنع التلاعب، يجب تعديل "بيانات مفتاح الحساب" أعلاه قليلاً لتضمين معلومات البطارية عندما يتم تضمين قيم البطارية في الإعلان. عادةً، عند إنشاء فلتر مفتاح الحساب، يتم إنشاء قيمة V من خلال الجمع بين مفتاح الحساب و"الملح". بدلاً من ذلك، عندما يتم الإعلان أيضًا عن معلومات البطارية، يجب إنشاء القيمة V على النحو التالي:
- إنشاء قيمة V، حيث:
- أول 16 بايت هي K.
- البايتات التالية هي "الملح".
- البايتات المتبقية هي معلومات البطارية (من 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];
}
لمنع التتبّع، يجب ألا يتضمّن "مزوّد الخدمة" بيانات البطارية الأولية في الإعلان طوال الوقت. بدلاً من ذلك، يمكن إرسالها عبر "بث الرسائل" عند الاتصال بـ "باحث"، يمكنك الاطّلاع على مقالة بث الرسائل: معلومات الجهاز.