سیگنال تبلیغاتی ارائه دهنده

تبلیغات: زمانی که قابل کشف باشد

هنگامی که دستگاه ارائه دهنده BR/EDR قابل شناسایی است (یعنی در حالت جفت شدن)، باید داده های شناسه مدل جفت سریع را روی BLE تبلیغ کند و آدرس BLE نباید چرخانده شود.

فاصله زمانی تبلیغات: زمانی که قابل کشف باشد

فاصله بین تبلیغات نباید بیشتر از 100 میلی ثانیه (10 هرتز) باشد. نرخ سریع به جستجوگر اجازه می دهد تا به سرعت ارائه دهنده را پیدا کند، حتی زمانی که در حالت کم مصرف اسکن می کند.

محموله تبلیغاتی: داده های شناسه مدل جفت سریع

آگهی باید شامل نوع داده سرویس، همان، § 1.11 باشد. UUID باید UUID سرویس جفت سریع 0xFE2C باشد. داده های سرویس باید شامل موارد زیر باشد:

اکتت نوع داده توضیحات ارزش
0-2 uint24 شناسه مدل 24 بیتی متفاوت است

تبلیغات: زمانی که قابل کشف نباشد

هنگامی که قابل کشف نباشد (یعنی در حالت جفت شدن نیست)، دستگاه ارائه دهنده باید داده های حساب جفت سریع را با استفاده از دستورالعمل های زیر تبلیغ کند.

تبلیغ داده‌های حساب به جستجوگران نزدیک امکان می‌دهد تشخیص دهند که ارائه‌دهنده متعلق به حساب آن‌ها است و جفت‌سازی را بدون نیاز به وادار کردن ارائه‌دهنده به حالت جفت‌سازی ابتدا آغاز کنند، که یک دلیل رایج برای شکایت کاربر است. جستجوگرها این فرصت را برای کاربران فراهم می‌کنند که بتوانند این پخش را در مواردی که منتظر جفت شدن با ارائه‌دهنده نیستند یا پخش مرتبط نیست (مثلاً اگر قبلاً جفت شده‌اند) را نادیده بگیرند. جستجوگرها همچنین پخش‌های بدیهی بدیهی را به‌طور خودکار فیلتر می‌کنند، مانند زمانی که داده‌های حساب به درستی پیکربندی نشده است.

فاصله زمانی تبلیغات: زمانی که قابل کشف نباشد

فاصله بین تبلیغات باید حداکثر 250 میلی ثانیه (4 هرتز) باشد.

بار تبلیغاتی: داده های حساب جفت سریع

آگهی باید شامل نوع داده خدمات، همان، § 1.11 باشد. UUID باید UUID سرویس جفت سریع 0xFE2C باشد. داده های سرویس باید شامل موارد زیر باشد:

اکتت نوع داده توضیحات ارزش
0 uint8 نسخه و پرچم ها
0bVVVVFFFF
  • V = نسخه
  • F = پرچم
0x00
(برای استفاده در آینده رزرو شده است)
1 - متفاوت است داده های کلیدی حساب متفاوت است
یا 0x00 اگر فهرست کلید حساب خالی باشد

داده های کلید حساب شامل:

اکتت نوع داده توضیحات ارزش
0 uint8 طول و نوع میدان
0bLLLLTTTT
  • L = طول فیلتر کلید حساب بر حسب بایت
  • T = نوع
0bLLLL0000
  • طول = 0bLLLL = متفاوت است
  • نوع = 0b0000 (نمایش نشانگر رابط کاربری) یا 0b0010 (پنهان کردن نشانگر رابط کاربری)، فیلتر کلید حساب
1 - s فیلتر کلید حساب متفاوت است
s + 1 uint8 طول و نوع میدان
0bLLLLTTTT
  • L = طول بر حسب بایت
  • T = نوع
0b00100001
  • طول = 0b0010 = 2
  • نوع = 0b0001، نمک
s + 2 - s + 3 uint16 نمک متفاوت است

فیلتر کلید حساب

فیلتر کلید حساب تبلیغ شده به جستجوگر اجازه می دهد تا به سرعت بررسی کند که آیا یک ارائه دهنده ممکن است دارای یک کلید حساب خاص (با احتمال مثبت کاذب کم، به طور متوسط ​​بسیار کمتر از 0.5٪) قبل از تعاملات بعدی باشد. جستجوگر ممکن است به طور خودکار متصل شود و زمانی که فیلتری را با نوع 0 در حال پخش می‌بیند، یعنی نشان‌دهنده UI را نشان می‌دهد که احتمالاً یکی از کلیدهای حسابش را در بر می‌گیرد، به‌طور خودکار وصل شده و تلاش می‌کند تا نرخ مثبت کاذب را بیشتر کاهش دهد. در برخی شرایط، ارائه دهنده ممکن است بخواهد توسط جستجوگر شناسایی شود در حالی که برای جفت شدن آماده نیست. یک مثال این است که وقتی جوانه‌ها دوباره در جعبه قرار می‌گیرند، می‌خواهیم نشان دادن اعلان جفت‌سازی بعدی را متوقف کنیم، زیرا این جفت‌سازی ممکن است توسط هدست رد شود.

فیلتر کلید حساب یک فیلتر بلوم با طول متغیر است که به شرح زیر ساخته شده است:

  1. فرض کنید n تعداد کلیدهای حساب ( n >= 1) در لیست موجود کلید حساب باشد.
  2. اجازه دهید s ، اندازه فیلتر بر حسب بایت، (1.2* n + 3) کوتاه شود. به عنوان مثال، اگر 1 کلید ثابت است، 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 ، نمک ).

    // 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 = {H 0 , …, H 31 }.

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    ج H را به هشت عدد صحیح بدون علامت 4 بایتی در big-endian تقسیم کنید، X = {X 0 , …, X 7 }، که در آن X 0 = 0xH 0 H 1 H 2 H 3 .

         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);
         }
    

    د برای هر X i :
    من فرض کنید M باشد X i مدول تعداد بیت‌های موجود در فیلتر، ( s * 8).
    ii بایت را در F در شاخص ( M / 8)، گرد به پایین دریافت کنید.
    III. در داخل بایت، بیت را در شاخص ( M % 8) روی 1 تنظیم کنید.
    IV به عبارت دیگر:

        // 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 را به عنوان قسمت فیلتر کلید حساب، در داده های تبلیغاتی وارد کنید. توجه داشته باشید که هیچ "Edianness" برای این مقدار وجود ندارد، زیرا بایت کم و بیش قابل توجهی وجود ندارد - ترتیب بایت ها را تغییر ندهید.

مزرعه نمک

نمک یک مقدار تصادفی است که هنگام ساخت فیلتر شکوفه به کلیدهای حساب اضافه می شود. این نمک باید هر بار که RPA برای ارائه دهنده به روز می شود، بازسازی شود تا از ردیابی در چرخش آدرس جلوگیری شود.

برای ایجاد فیلتر کلید حساب با استفاده از salt:

  1. یک S تصادفی 2 بایتی تولید کنید. توجه داشته باشید که هیچ "Edianness" برای این مقدار وجود ندارد، زیرا بایت کم و بیش قابل توجهی وجود ندارد - ترتیب بایت ها را تغییر ندهید.
  2. از S 2 بایتی به عنوان Salt استفاده کنید.
  3. در داده های حساب جفت سریع تبلیغ شده، فیلتر ایجاد شده را در قسمت فیلتر کلید حساب و S را در قسمت نمک قرار دهید.