إشارة الإعلانات المقدَّمة من مقدّم الخدمة
الإعلانات: الحالات التي يمكن فيها العثور على التطبيق
عندما يكون جهاز الموفِّر قابلاً للاكتشاف عبر بروتوكول BR/EDR (أي في وضع الإقران)، عليه نشر بيانات معرّف طراز ميزة "الإقران السريع" عبر تقنية BLE، ويجب عدم تبديل عنوان BLE.
الفاصل الزمني للإعلانات: عندما تكون الإعلانات قابلة للاكتشاف
يجب ألا يزيد الفاصل الزمني بين الإعلانات عن 100 ملي ثانية (10 هرتز). تسمح السرعة العالية للمستكشف بالعثور على الموفِّر بسرعة، حتى عند البحث في وضع الطاقة المنخفضة.
الحمولة الإعلانية: بيانات معرّف طراز "الإقران السريع"
يجب أن يحتوي الإعلان على نوع البيانات Service Data (بيانات الخدمة)، راجع المصدر نفسه. § 1.11. يجب أن يكون
المعرّف الفريد العام هو المعرّف الفريد العام لخدمة "الإقران السريع" في 0xFE2C
. يجب أن تحتوي بيانات الخدمة
على ما يلي:
وحدة ثمانيّة البت | نوع البيانات | الوصف | القيمة |
---|---|---|---|
0-2 | uint24 |
معرّف الطراز بسعة 24 بت | تختلف |
الإعلانات: الحالات التي لا يمكن فيها العثور على التطبيق
عندما لا يكون الجهاز مرئيًا (أي ليس في وضع الإقران)، يجب أن يُعلِن جهاز الموفِّر عن "بيانات حساب الإقران السريع" باستخدام الإرشادات التالية.
من خلال عرض بيانات الحساب، يمكن للباحثين القريبين منك معرفة ما إذا كان مقدّم الخدمة تابعًا لحسابك وبدء عملية الإقران بدون الحاجة إلى إجبار المقدّم على العودة إلى وضع الإقران أولاً، وهو سبب شائع لتلقّي شكاوى من المستخدمين. ستتيح ميزة "البحث عن الأجهزة" للمستخدمين إمكانية تجاهل هذا البث في حال عدم انتظار الإقران مع مقدّم الخدمة أو إذا لم يكن البث ذا صلة (على سبيل المثال، إذا سبق أن تم إقران الجهاز). ستتم أيضًا فلترة البثّات السيئة بشكل تلقائي من قِبل الباحثين، مثل في حال ضبط بيانات الحساب بشكل غير صحيح.
الفاصل الزمني للإعلانات: عندما لا تكون قابلة للاكتشاف
يجب ألا تزيد الفترة الزمنية بين الإعلانات عن 250 ملي ثانية (4 هرتز).
الحمولة الإعلانية: بيانات حساب "الإقران السريع"
يجب أن يحتوي الإعلان على نوع البيانات "بيانات الخدمة"، راجع المصدر نفسه. § 1.11. يجب أن يكون
المعرّف الفريد العام هو المعرّف الفريد العام لخدمة "الإقران السريع" في 0xFE2C
. يجب أن تحتوي بيانات الخدمة
على ما يلي:
وحدة ثمانيّة البت | نوع البيانات | الوصف | القيمة |
---|---|---|---|
0 | uint8 |
الإصدار والعلامات 0bVVVVFFFF
|
0x00 (محجوزة للاستخدام في المستقبل) |
1 - تختلف | بيانات مفتاح الحساب | تختلف |
تحتوي "بيانات مفتاح الحساب" على ما يلي:
وحدة ثمانيّة البت | نوع البيانات | الوصف | القيمة |
---|---|---|---|
0 | uint8 |
طول الحقل ونوعه 0bLLLLTTTT
|
0bLLLL0000
|
1 - ثانية | فلتر مفتاح الحساب | تختلف | |
s + 1 | uint8 |
طول الحقل ونوعه 0bLLLLTTTT
|
0b00100001
|
s + 2 - s + 3 | uint16 |
Salt | تختلف |
فلتر مفتاح الحساب
يسمح فلتر مفتاح الحساب المُعلَن عنه للمستخدِم بالبحث بسرعة لمعرفة ما إذا كان أحد مقدمي الخدمة يمتلك مفتاح حساب معيّنًا (مع احتمالية منخفضة للنتائج الإيجابية الزائفة، في المتوسط أقل بكثير من %0.5)، قبل إجراء المزيد من التفاعلات. قد يتم ربط "أداة البحث" تلقائيًا ومحاولة بدء الإجراء عند رصدها لفلتر يتم بثه بالنوع 0، أي عرض إشارة واجهة المستخدم التي قد تحتوي على أحد مفاتيح الحساب، وذلك لتقليل معدّل الإيجابية الخاطئة بشكلٍ أكبر. في بعض الحالات، قد يريد مقدّم الخدمة أن يتم التعرّف عليه من قِبل جهاز البحث عندما لا يكون مستعدًا للإقران. على سبيل المثال، عند إعادة وضع سمّاعات الأذن في العلبة، نريد إيقاف عرض إشعار الإقران اللاحق، لأنّ سماعة الرأس قد ترفض هذا الإقران.
فلتر مفتاح الحساب هو فلتر Bloom بطول متغيّر يتم إنشاؤه على النحو التالي:
- لنفترض أنّ n هو عدد مفاتيح الحساب (n >= 1) في قائمة مفاتيح الحساب الثابتة.
- لنفترض أنّ s، حجم الفلتر بالبايت، هو (1.2*n + 3) مقطوع. على سبيل المثال، إذا تم الاحتفاظ بمفتاح واحد، تكون s = 4 بايت.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- فعِّل الفلتر F كصفيف من بايت s، مع ضبط كل بايتة على 0.
uint8_t F[s] = {0};
لكل مفتاح حساب K في قائمة مفاتيح الحساب الثابتة:
أ. لنفترض أنّ V هي concat(K, Salt).// In the sample code, the size of salt is 2 bytes. #define SALT_SIZE 2 uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE]; for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++) { // concat (K, Salt) fastpair_get_account_key_by_index(keyIndex, V); uint8_t randomSalt = (uint8_t)rand(); V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt; ... }
ب- تجزئة V باستخدام SHA256، والحصول على قيمة H = {H0, …, H31} من 32 بايت
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
ج. قسِّم H إلى ثمانية أعداد صحيحة غير موقَّتة بسعة 4 بايت بترتيب كبار السن، X = {X0, …, X7}، حيث X0 = 0xH0H1H2H3.
uint32_t X[8]; for (index = 0; index < 8; index++) { X[index] = (((uint32_t)(H[index * 4])) << 24) | (((uint32_t)(H[index * 4 + 1])) << 16) | (((uint32_t)(H[index * 4 + 2])) << 8) | (((uint32_t)(H[index * 4 + 3])) << 0); }
د- لكل قيمة Xi:
1- لنفترض أنّ M هو Xi modulo عدد الوحدات في الفلتر، (s * 8).
2- احصل على البايت في F في الفهرس (M / 8)، مع التقريب للأسفل.
3- ضمن البايت، اضبط القيمة 1 على النقطة في الفهرس (M % 8).
4- بعبارة أخرى:// M = Xi % (s * 8) // F[M/8] = F[M/8] | (1 << (M % 8)) for (index = 0; index < 8; index++) { uint32_t M = X[index] % (s * 8); F[M / 8] = F[M / 8] | (1 << (M % 8)); }
أدرِج الفلتر F كحقل فلتر مفتاح الحساب في البيانات الإعلانية. يُرجى العلم أنّه لا يمكن تحديد ترتيب البايتات لهذه القيمة، لأنّه لا يوجد بايت أكثر أو أقل أهمية، لذا لا تغيِّر ترتيب البايتات.
حقل ملح
الملح هو قيمة عشوائية يتم إلحاقها بمفاتيح الحساب عند إنشاء فلتر Bloom. يجب إعادة إنشاء هذه الملح في كل مرة يتم فيها تعديل RPA لتجنُّب التتبُّع على مستوى تبديل العناوين.
لإنشاء فلتر مفتاح الحساب باستخدام الملح:
- أنشئ S عشوائيًا مكوّنًا من بايتين. يُرجى العِلم أنّه لا تتوفّر "ترتيب تسلسل البايتات" لهذه القيمة، لأنّه لا يتوفّر بايت أكثر أو أقل أهمية، لذا لا تغيِّر ترتيب البايتات.
- استخدِم الرمز المكوّن من بايتين S كقيمة الملح.
- في بيانات حساب "الإقران السريع" المُعلَن عنها، أدرِج الفلتر الذي تم إنشاؤه في حقل فلتر مفتاح الحساب، وS في حقل الملح.