إشارة "الإعلانات المقدَّمة من المزوّد"

الإعلان: عندما تكون قابلة للاكتشاف

عندما يكون جهاز مقدّم الخدمة قابلاً للاكتشاف باستخدام BR/EDR (أي في وضع الإقران)، يجب أن يعلن عن بيانات معرّف طراز "الإقران السريع" عبر البلوتوث المنخفض الطاقة، ويجب عدم تغيير عنوان البلوتوث المنخفض الطاقة.

الفاصل الزمني للإعلان: عندما تكون قابلة للاكتشاف

يجب ألا يزيد الفاصل الزمني بين الإعلانات عن 100 ملي ثانية (10 هرتز). يسمح معدّل النقل السريع لجهاز Seeker بالعثور بسرعة على جهاز Provider، حتى عند إجراء عملية البحث في وضع توفير الطاقة.

حمولة الإعلان: بيانات معرّف طراز "الإقران السريع"

يجب أن يحتوي الإعلان على نوع بيانات "بيانات الخدمة"، المصدر نفسه، ‫§ 1.11. يجب أن يكون معرّف UUID هو معرّف UUID لخدمة "الإقران السريع" الخاصة بـ 0xFE2C. يجب أن تتضمّن بيانات الخدمة ما يلي:

Octet نوع البيانات الوصف القيمة
0-2 uint24 معرّف النموذج المكوّن من 24 بت يختلف

حمولة إعلان المشاركة عبر LE Audio: بيانات رقم تعريف طراز الإقران السريع وخريطة إمكانات FP

يجب أن تتضمّن بيانات الخدمة ما يلي:

Octet نوع البيانات الوصف القيمة
0 uint8 الإصدار والعلامات
0bVVVVFFFF
  • V = الإصدار
  • F = العلامات
0x00
1 uint8 طول الحقل ونوعه
0bLLLLTTTT
  • L = طول معرّف النموذج بالبايت
  • T = type
0bLLLL0111
  • length = 0bLLLL = يختلف
  • type = 0b0111, Model ID
‫2 - ث رقم تعريف الطراز يختلف
s + 1 uint8 طول الحقل ونوعه
0bLLLLTTTT
  • L = الطول بالبايت
  • T = type
0bLLLL1000
s + 2 uint8 خريطة إمكانات FP يختلف
خريطة إمكانات FP

خريطة إمكانات بصمة الإصبع هي صورة نقطية تمثّل ميزات بصمة الإصبع التي يتيحها مقدّم الخدمة. يتم تحديد البايت الأول من الصورة النقطية على النحو التالي:

الصورة النقطية الوصف
0bRRRRRRSO R - بت محجوز، سيتجاهله الباحث حاليًا ويجب ضبطه على 0.
S - بت متوافق مع ميزة "مشاركة الصوت" في LE Audio (يجب ضبطه على 1 في حال تفعيل الميزة، وإلا يجب ضبطه على 0).
O - بت "خارج الصندوق"، يجب ضبطه على 1 إذا كان الجهاز جديدًا.

إذا كان الموفّر يتوافق مع مواصفات FP LE Audio Sharing (ما يعني أنّه يتوافق مع الإقران المؤقت وLE Audio Sharing Advertising Payload وHearable control version 2)، اضبط بت توافق FP LE Audio Sharing على 1، وإلا اضبطه على 0.

إذا لم يتم إقران الموفِّر بأي جهاز باحث عن أجهزة مجاورة وكان جديدًا (أي لا تتوفّر مفاتيح حسابات "العثور على الأجهزة المجاورة" على الموفِّر)، اضبط بت OOB على 1، وإلا اضبطه على 0.

الإعلانات: عندما لا يكون الجهاز قابلاً للاكتشاف

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

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

فاصل الإعلان: عندما لا يكون الجهاز قابلاً للاكتشاف

يجب ألا يتجاوز الفاصل الزمني بين الإعلانات 250 ملي ثانية (4 هرتز).

الحِمل الإعلاني: بيانات حساب "الإقران السريع"

يجب أن يحتوي الإعلان على نوع بيانات "بيانات الخدمة"، المصدر نفسه، ‫§ 1.11. يجب أن يكون معرّف UUID هو معرّف UUID لخدمة "الإقران السريع" الخاصة بـ 0xFE2C. يجب أن تتضمّن بيانات الخدمة ما يلي:

Octet نوع البيانات الوصف القيمة
0 uint8 الإصدار والعلامات
0bVVVVFFFF
  • V = الإصدار
  • F = العلامات
‫0x00
(محجوزة للاستخدام في المستقبل)
‫1 - يختلف بيانات مفتاح الحساب يختلف

تحتوي بيانات مفتاح الحساب على ما يلي:

Octet نوع البيانات الوصف القيمة
0 uint8 طول الحقل ونوعه
0bLLLLTTTT
  • L = طول فلتر مفتاح الحساب بالبايت
  • T = type
0bLLLL0000
  • length = 0bLLLL = يختلف
  • type = 0b0000 (إظهار مؤشر واجهة المستخدم) أو 0b0010 (إخفاء مؤشر واجهة المستخدم)، فلتر مفتاح الحساب
1 - s فلتر مفتاح الحساب يختلف
s + 1 uint8 طول الحقل ونوعه
0bLLLLTTTT
  • L = الطول بالبايت
  • T = type
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt يختلف

فلتر مفتاح الحساب

تتيح ميزة "فلتر مفتاح الحساب" المُعلن عنها للمستخدم التحقّق بسرعة مما إذا كان مقدّم الخدمة يملك مفتاح حساب معيّنًا (مع احتمال منخفض لحدوث نتائج إيجابية خاطئة، أي أقل بكثير من %0.5 في المتوسط)، وذلك قبل إجراء المزيد من التفاعلات. قد يتصل جهاز الباحث تلقائيًا ويحاول بدء الإجراء عندما يرى فلترًا يتم بثه من النوع 0، أي يعرض إشارة واجهة المستخدم، والذي قد يحتوي على أحد مفاتيح الحساب، وذلك لتقليل معدل النتائج الإيجابية الخاطئة بشكل أكبر. في بعض الحالات، قد يريد "الموفّر" أن يتعرّف عليه "الباحث" بدون أن يكون جاهزًا لعملية الإقران. على سبيل المثال، عندما يتم وضع السمّاعات في الحافظة، نريد إيقاف عرض إشعار الإقران اللاحق لأنّ السمّاعة قد ترفض عملية الإقران هذه.

فلتر مفتاح الحساب هو فلتر Bloom ذو طول متغير يتم إنشاؤه على النحو التالي:

  1. لنفترض أنّ n هو عدد مفاتيح الحسابات (n >= 1) في قائمة مفاتيح الحسابات المحفوظة.
  2. ليكن s هو حجم الفلتر بالبايت، ويساوي (1.2*n + 3) بعد اقتطاعه. على سبيل المثال، إذا تم الاحتفاظ بمفتاح واحد، ستكون قيمة s هي 4 بايت.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. ابدأ الفلتر F كصفيف من s بايت، كل منها مضبوط على 0.
    uint8_t F[s] = {0};
  4. لكل مفتاح حساب 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 بحجم 32 بايت = {H0, …, H31}.

    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. ضِمن البايت، اضبط البت في الفهرس (M % 8) على 1.
    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 كحقل "فلتر مفتاح الحساب" في بيانات الإعلانات. يُرجى العِلم أنّه لا يوجد "ترتيب بايتات" لهذه القيمة، لأنّه لا يوجد بايت أكثر أو أقل أهمية، لذا لا تغيّر ترتيب البايتات.

حقل الملح

الملح هو قيمة عشوائية يتم إلحاقها بمفاتيح الحساب عند إنشاء فلتر التفتيح. يجب إعادة إنشاء هذا النص العشوائي في كل مرة يتم فيها تعديل RPA لمقدّم الخدمة لتجنُّب التتبُّع على مستوى تدوير العناوين.

لإنشاء فلتر مفتاح الحساب باستخدام القيمة العشوائية، اتّبِع الخطوات التالية:

  1. أنشئ S عشوائيًا مكوّنًا من بايتَين. يُرجى العِلم أنّه لا يوجد "ترتيب بايتات" لهذه القيمة، لأنّه لا يوجد بايت أكثر أو أقل أهمية، لذا لا تغيّر ترتيب البايتات.
  2. استخدِم S المكوّن من بايتَين كقيمة Salt.
  3. في بيانات حساب "الإقران السريع" المُعلن عنها، أدرِج الفلتر الذي تم إنشاؤه في حقل Account Key Filter، وأدرِج S في حقل Salt.