إشارة إعلانات الموفّر

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

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

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

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

حمولة الإعلانات: بيانات رقم تعريف النموذج للإقران السريع

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

ثُمانِي واحد نوع البيانات الوصف القيمة
من عمر الولادة إلى عامين uint24 رقم تعريف طراز 24 بت يختلف

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

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

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

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

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

حمولة الإعلانات: الإقران السريع لبيانات الحساب

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

ثُمانِي واحد نوع البيانات الوصف القيمة
0 uint8 الإصدار والعلامات
0bVVVVFFFF
  • V = الإصدار
  • F = علامات
0x00
(محجوز للاستخدام في المستقبل)
1 - يختلف البيانات الأساسية للحساب يختلف
أو 0x00 إذا كانت قائمة مفاتيح الحساب فارغة

تحتوي البيانات الأساسية للحساب على:

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

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

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

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

  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، ويكون الناتج عن قيمة 32 بايت H = {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 مع باقي عدد وحدات البت في الفلتر (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 بايت. يُرجى العلم أنّ هذه القيمة ليست "دقة" إذ لا يوجد بايت أكثر أو أقل أهمية، لذا لا تغيّر ترتيب البايت.
  2. استخدِم رمز الملح S المكوّن من 2 بايت.
  3. في بيانات الحساب التي تم الإعلان عنها باستخدام ميزة "الإقران السريع" وS في الحقل "Salt"، أدرِج الفلتر الذي تم إنشاؤه في حقل "فلتر مفتاح الحساب".