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

تبلیغات: وقتی قابل کشف باشند

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

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

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

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

این آگهی باید شامل نوع داده Service Data، همان، بند 1.11 باشد. UUID باید UUID سرویس Fast Pair با شناسه 0xFE2C باشد. داده‌های سرویس باید شامل موارد زیر باشند:

هشت‌تایی نوع داده توضیحات ارزش
۰-۲ uint24 شناسه مدل ۲۴ بیتی متغیر است

بار مفید تبلیغات اشتراک‌گذاری صوتی LE: داده‌های شناسایی مدل جفت‌سازی سریع و نقشه قابلیت FP

داده‌های سرویس باید شامل موارد زیر باشد:

هشت‌تایی نوع داده توضیحات ارزش
0 uint8 نسخه و پرچم‌ها
۰بVVVVFFFF
  • V = نسخه
  • F = پرچم‌ها
0x00
۱ uint8 طول و نوع فیلد
عالی
  • L = طول شناسه مدل بر حسب بایت
  • T = نوع
0bLLLL0111
  • طول = 0bLLLL = متغیر است
  • نوع = 0b0111، شناسه مدل
۲ - ثانیه شناسه مدل متغیر است
ها + ۱ uint8 طول و نوع فیلد
عالی
  • L = طول بر حسب بایت
  • T = نوع
0bLLLL1000
ها + ۲ uint8 نقشه قابلیت FP متغیر است
نقشه قابلیت FP

نقشه قابلیت‌های FP یک بیت‌مپ است که نشان می‌دهد ارائه‌دهنده از کدام ویژگی‌های FP پشتیبانی می‌کند. اولین بایت این بیت‌مپ به صورت زیر تعریف می‌شود:

بیت‌مپ توضیحات
۰bRRRRRRSO R - بیت رزرو شده، فعلاً توسط جستجوگر نادیده گرفته می‌شود و روی ۰ تنظیم می‌شود.
S - پشتیبانی از اشتراک‌گذاری صوتی FP LE (در صورت فعال بودن روی ۱ و در غیر این صورت ۰ تنظیم شود).
O - بیت خارج از جعبه (OOB)، اگر دستگاه نو باشد، روی ۱ تنظیم می‌شود.

اگر ارائه‌دهنده از مشخصات اشتراک‌گذاری صوتی FP LE پشتیبانی می‌کند (به این معنی که از جفت‌سازی موقت ، بار مفید تبلیغات اشتراک‌گذاری صوتی LE و کنترل قابل شنیدن نسخه ۲ پشتیبانی می‌کند)، بیت پشتیبانی اشتراک‌گذاری صوتی FP LE را روی ۱ تنظیم کنید؛ در غیر این صورت، آن را روی ۰ تنظیم کنید.

اگر Provider با هیچ FP Seeker جفت نشده و کاملاً نو است (به این معنی که هیچ کلید حساب FP روی Provider وجود ندارد)، بیت OOB را روی ۱ تنظیم کنید؛ در غیر این صورت، آن را روی ۰ تنظیم کنید.

تبلیغات: وقتی قابل کشف نیست

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

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

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

فاصله بین تبلیغات باید حداکثر ۲۵۰ میلی‌ثانیه (۴ هرتز) باشد.

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

این آگهی باید شامل نوع داده Service Data، همان، بند ۱.۱۱ باشد. UUID باید UUID سرویس Fast Pair با شناسه 0xFE2C باشد. داده‌های سرویس باید شامل موارد زیر باشند:

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

داده‌های کلید حساب شامل موارد زیر است:

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

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

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

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

  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 به صورت ( 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 = {H 0 , … , H 31 } را بدست می‌دهد.

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

    ج) H را به هشت عدد صحیح بدون علامت ۴ بایتی در تابع big-endian تقسیم کنید، 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);
         }
    

    د. برای هر X i :
    فرض کنید M برابر با X i به پیمانه تعداد بیت‌های فیلتر باشد ( s * 8).
    دوم. بایت موجود در F را با اندیس ( M / 8) به پایین گرد کنید.
    iii. درون بایت، بیتِ اندیس ( M %8) را روی ۱ تنظیم کن.
    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 را به عنوان فیلد فیلتر کلید حساب، در داده‌های تبلیغاتی وارد کنید. توجه داشته باشید که هیچ "endianness" برای این مقدار وجود ندارد، زیرا هیچ بایت کم یا بیش قابل توجهی وجود ندارد - ترتیب بایت را تغییر ندهید.

میدان نمک

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

برای تولید فیلتر کلید حساب با استفاده از نمک:

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