প্রোভাইডার বিজ্ঞাপন সিগন্যাল

বিজ্ঞাপন: খুঁজে নেওয়ার যোগ্য হলে

প্রোভাইডার ডিভাইস BR/EDR খুঁজে নেওয়ার যোগ্য (অর্থাৎ, পেয়ারিং মোডে) হলে, এটি BLE-তে Fast Pair মডেল আইডি ডেটা বিজ্ঞাপন করবে এবং BLE অ্যাড্রেস ঘোরানো হবে না।

বিজ্ঞাপন দেখানোর ইন্টারভাল: যখন খুঁজে পাওয়া যায়

বিজ্ঞাপনের মধ্যে ব্যবধান ১০০ মিলি সেকেন্ডের (১০ হার্জ) বেশি হওয়া উচিত নয়। দ্রুত রেট থাকলে, লো-পাওয়ার মোডে স্ক্যান করার সময়ও, সিকার দ্রুত প্রোভাইডারকে খুঁজে নিতে পারে।

বিজ্ঞাপন পেলোড: দ্রুত পেয়ার মডেল আইডি ডেটা

বিজ্ঞাপনে সার্ভিস ডেটা ডেটার ধরন, ibid., থাকতে হবে § ১.১১. UUID হবে 0xFE2C-এর দ্রুত পেয়ার পরিষেবার UUID। পরিষেবা ডেটাতে নিম্নলিখিত তথ্য থাকবে:

অক্টেট ডেটার ধরন বিবরণ ভ্যালু
০-২ uint24 ২৪-বিট মডেল আইডি পরিবর্তন হয়

LE অডিও শেয়ারিং বিজ্ঞাপন পেলোড: দ্রুত পেয়ার মডেল আইডি ডেটা এবং FP ক্যাপাবিলিটি ম্যাপ

পরিষেবা ডেটাতে নিম্নলিখিত তথ্য থাকবে:

অক্টেট ডেটার ধরন বিবরণ ভ্যালু
0 uint8 ভার্সন ও ফ্ল্যাগ
0bVVVVFFFF
  • V = ভার্সন
  • F = ফ্ল্যাগ
0x00
1 uint8 ফিল্ডের দৈর্ঘ্য ও ধরন
0bLLLLTTTT
  • L = বাইটে মডেল আইডির দৈর্ঘ্য
  • T = ধরন
0bLLLL0111
  • দৈর্ঘ্য = 0bLLLL = পরিবর্তন হয়
  • type = 0b0111, মডেল আইডি
২ - s মডেল আইডি পরিবর্তন হয়
s + ১ uint8 ফিল্ডের দৈর্ঘ্য ও ধরন
0bLLLLTTTT
  • L = বাইটে দৈর্ঘ্য
  • T = ধরন
0bLLLL1000
s + ২ uint8 FP ক্যাপাবিলিটি ম্যাপ পরিবর্তন হয়
FP ক্যাপাবিলিটি ম্যাপ

FP ক্যাপাবিলিটি ম্যাপ হল একটি বিটম্যাপ যা দেখায় যে কোন FP ফিচার প্রোভাইডার সাপোর্ট করে। বিটম্যাপের প্রথম বাইট এইভাবে সংজ্ঞায়িত করা হয়:

বিটম্যাপ বিবরণ
0bRRRRRRSO R - সংরক্ষিত বিট, এখনকার জন্য সিকার উপেক্ষা করবে এবং ০ হিসেবে সেট করা হবে।
S - FP LE অডিও শেয়ারিং সাপোর্ট (চালু থাকলে ১ হিসেবে সেট করা হবে, অন্যথায় ০)।
O - আউট অফ বক্স (OOB) বিট, ডিভাইস ফ্যাক্টরি নতুন হলে ১ হিসেবে সেট করা হবে।

প্রোভাইডার FP LE অডিও শেয়ারিং স্পেসিফিকেশন (অর্থাৎ, এটি সাময়িক পেয়ারিং, LE অডিও শেয়ারিং বিজ্ঞাপন পেলোড এবং হিয়ারেবল কন্ট্রোল ভার্সন ২) সাপোর্ট করলে, FP LE অডিও শেয়ারিং সাপোর্ট বিট ১-এ সেট করুন; অন্যথায়, এটি ০-তে সেট করুন।

প্রোভাইডার যদি কোনও FP সিকারের সাথে পেয়ার না করে থাকে এবং ফ্যাক্টরি নিউ হয় (অর্থাৎ প্রোভাইডারে কোনও FP অ্যাকাউন্ট কী নেই), তাহলে OOB বিট ১-এ সেট করুন; অন্যথায়, এটি ০-তে সেট করুন।

Coordinated Set Info Advertising পেলোড: Fast Pair মডেল আইডি ডেটা এবং FP Coordinated Set Info

পরিষেবা ডেটাতে নিম্নলিখিত তথ্য থাকবে:

অক্টেট ডেটার ধরন বিবরণ ভ্যালু
0 uint8 ভার্সন ও ফ্ল্যাগ
0bVVVVFFFF
  • V = ভার্সন
  • F = ফ্ল্যাগ
0x00
1 uint8 ফিল্ডের দৈর্ঘ্য ও ধরন
0bLLLLTTTT
  • L = বাইটে মডেল আইডির দৈর্ঘ্য
  • T = ধরন
0bLLLL0111
  • দৈর্ঘ্য = 0bLLLL = পরিবর্তন হয়
  • type = 0b0111, মডেল আইডি
২ - s মডেল আইডি পরিবর্তন হয়
s + ১ uint8 ফিল্ডের দৈর্ঘ্য ও ধরন
0bLLLLTTTT
  • L = কোঅর্ডিনেট করা সেট ডেটার দৈর্ঘ্য
  • T = ধরন
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 FP কোঅর্ডিনেটেড সেট ডেটা ৬-বাইট ডেটা, FP কোঅর্ডিনেটেড সেট তথ্য দেখুন
FP কোঅর্ডিনেটেড সেট সংক্রান্ত তথ্য

বিজ্ঞাপন দেখানোর ডিভাইসটি একই কোঅর্ডিনেটেড সেটে আছে কিনা তা শনাক্ত করতে FP কোঅর্ডিনেটেড সেট সংক্রান্ত তথ্য ব্যবহার করা হয়।

অক্টেট ডেটার ধরন বিবরণ ভ্যালু
0 uint8 সমন্বিত সেট সাইজ আলাদা আলাদা হয়
1 uint8 দ্রুত পেয়ার কোঅর্ডিনেটেড সেট মেম্বার টাইপ
    -এর মধ্যে একটি হতে পারে
  • 0x00 : বাঁদিকের কম্পোনেন্ট
  • 0x01 : ডানদিকের কম্পোনেন্ট
২ - ৫ uint32 পরিচয় সমাধানকারী কী হ্যাশ সেট করুন আলাদা আলাদা হয়

সেট আইডেন্টিটি রিজলভিং কী-এর হ্যাশ ভ্যালু জেনারেট করার অ্যালগরিদম হল

  • SIRK ভ্যালু হ্যাশ করতে SHA256 ব্যবহার করুন

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • হ্যাশ ভ্যালু হিসেবে প্রথম চারটি বাইট এক্সট্র্যাক্ট করুন

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

পরিচয় সমাধানকারী কী সেট করার জন্য, আরও তথ্যের জন্য সমন্বিত সেট শনাক্তকরণ পরিষেবা দেখুন।

বিজ্ঞাপন: খুঁজে পাওয়া না গেলে

খুঁজে নেওয়ার যোগ্য না হলে (অর্থাৎ, পেয়ারিং মোডে না থাকলে), প্রোভাইডার ডিভাইস নিম্নলিখিত নির্দেশিকা ব্যবহার করে, 'দ্রুত পেয়ার' অ্যাকাউন্ট ডেটা বিজ্ঞাপন করবে।

অ্যাকাউন্ট ডেটা বিজ্ঞাপন করার মাধ্যমে, কাছাকাছি থাকা সিকাররা বুঝতে পারে যে কোনও প্রোভাইডার তাদের অ্যাকাউন্টের সাথে সম্পর্কিত কিনা এবং প্রোভাইডারকে আবার পেয়ারিং মোডে ফিরে যেতে বাধ্য না করেই পেয়ারিং শুরু করতে পারে, যা ব্যবহারকারীর অভিযোগের একটি সাধারণ কারণ। প্রোভাইডারের সাথে পেয়ার করার জন্য অপেক্ষা করতে না চাইলে বা ব্রডকাস্ট প্রাসঙ্গিক না হলে (যেমন, আগে থেকেই পেয়ার করা থাকলে), ব্যবহারকারী যাতে এই ব্রডকাস্ট উপেক্ষা করতে পারেন, সেই সুযোগ সিকার প্রদান করবে। এছাড়াও, সিকার অটোমেটিক খারাপ ব্রডকাস্ট ফিল্টার করে বাদ দেবে, যেমন অ্যাকাউন্ট ডেটা ভুলভাবে কনফিগার করা হলে।

বিজ্ঞাপন দেখানোর ব্যবধান: যখন খুঁজে পাওয়া যায় না

বিজ্ঞাপনের মধ্যে ব্যবধান সর্বাধিক ২৫০ মিলি সেকেন্ড (৪ হার্জ) হতে হবে।

বিজ্ঞাপন পেলোড: দ্রুত পেয়ার অ্যাকাউন্ট ডেটা

বিজ্ঞাপনে পরিষেবার ডেটা, ডেটার ধরন, Ibid. থাকতে হবে, § ১.১১. UUID হবে 0xFE2C-এর দ্রুত পেয়ার পরিষেবার UUID। পরিষেবা ডেটাতে নিম্নলিখিত তথ্য থাকবে:

অক্টেট ডেটার ধরন বিবরণ ভ্যালু
0 uint8 ভার্সন ও ফ্ল্যাগ
0bVVVVFFFF
  • V = ভার্সন
  • F = ফ্ল্যাগ
0x00
(ভবিষ্যতে ব্যবহারের জন্য সংরক্ষিত)
১ - পরিবর্তনশীল অ্যাকাউন্ট কী ডেটা পরিবর্তন হয়

অ্যাকাউন্ট কী ডেটাতে এগুলি থাকে:

অক্টেট ডেটার ধরন বিবরণ ভ্যালু
0 uint8 ফিল্ডের দৈর্ঘ্য ও ধরন
0bLLLLTTTT
  • L = বাইটে অ্যাকাউন্ট কী ফিল্টারের দৈর্ঘ্য
  • T = ধরন
0bLLLL0000
  • দৈর্ঘ্য = 0bLLLL = পরিবর্তন হয়
  • type = 0b0000 (UI ইঙ্গিত দেখান) অথবা 0b0010 (UI ইঙ্গিত লুকান), অ্যাকাউন্ট কী ফিল্টার
১ - s অ্যাকাউন্ট কী ফিল্টার পরিবর্তন হয়
s + ১ uint8 ফিল্ডের দৈর্ঘ্য ও ধরন
0bLLLLTTTT
  • L = বাইটে দৈর্ঘ্য
  • T = ধরন
0b00100001
  • দৈর্ঘ্য = 0b0010 = 2
  • type = 0b0001, Salt
s + ২ - s + ৩ uint16 সল্ট পরিবর্তন হয়

অ্যাকাউন্ট কী ফিল্টার

বিজ্ঞাপিত অ্যাকাউন্ট কী ফিল্টার, কোনও সিকারকে দ্রুত চেক করতে দেয় যে কোনও প্রোভাইডারের কাছে নির্দিষ্ট অ্যাকাউন্ট কী আছে কিনা (কম ভুল-পজিটিভ সম্ভাবনা সহ, গড়ে ০.৫% এর চেয়ে অনেক কম), আরও ইন্টার‍্যাকশনের আগে। Seeker অটোমেটিক কানেক্ট করতে এবং পদ্ধতিটি শুরু করার চেষ্টা করতে পারে যখন এটি দেখে যে 0 টাইপের সাথে একটি ফিল্টার ব্রডকাস্ট করা হচ্ছে, অর্থাৎ UI ইঙ্গিত দেখাচ্ছে, যা সম্ভাব্যভাবে এর একটি অ্যাকাউন্ট কী ধারণ করে, যাতে মিথ্যা পজিটিভের হার আরও কমানো যায়। কিছু পরিস্থিতিতে, পেয়ারিংয়ের জন্য প্রস্তুত না থাকলেও, প্রোভাইডার চাইতে পারে যে সিকার তাকে শনাক্ত করুক। যেমন, বাড কেসে ফেরত রাখা হলে, আমরা পরবর্তী পেয়ারিং বিজ্ঞপ্তি দেখানো বন্ধ করতে চাই, কারণ হেডসেট সেই পেয়ারিং বাতিল করতে পারে।

অ্যাকাউন্ট কী ফিল্টার হল একটি পরিবর্তনশীল-দৈর্ঘ্যের ব্লুম ফিল্টার যা নিম্নলিখিত উপায়ে তৈরি করা হয়:

  1. ধরা যাক, n হল সেভ করা অ্যাকাউন্ট কী-এর তালিকায় থাকা অ্যাকাউন্ট কী-এর সংখ্যা (n >= ১)।
  2. ধরা যাক, s হল বাইটে ফিল্টারের সাইজ, যা (১.২*n + ৩) ট্রাঙ্কেট করা হয়েছে। যেমন, ১টি কী থাকলে, s = ৪ বাইট।
    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;
          ... }
    

    খ. SHA256 ব্যবহার করে V হ্যাশ করুন, ৩২-বাইট ভ্যালু H = {H0, …, H31} পাওয়া যাচ্ছে।

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

    গ. H-কে বিগ-এন্ডিয়ানে আটটি ৪-বাইট আনসাইনড ইন্টিজারে ভাগ করুন, 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-এর জন্য:
    i. ধরা যাক, M হল ফিল্টারে বিটের সংখ্যার Xi মডিউলো, (s * 8).
    ii. 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 ফিল্টার অন্তর্ভুক্ত করুন। মনে রাখবেন যে এই ভ্যালুর কোনও "এন্ডিয়াননেস" নেই, কারণ এর কোনও বেশি বা কম গুরুত্বপূর্ণ বাইট নেই—বাইটের ক্রম পরিবর্তন করবেন না।

সল্ট ফিল্ড

ব্লুম ফিল্টার তৈরি করার সময় অ্যাকাউন্ট কীতে সল্ট হল একটি র‍্যান্ডম ভ্যালু যা যোগ করা হয়। ঠিকানা রোটেশন জুড়ে ট্র্যাকিং এড়াতে, প্রোভাইডারের জন্য RPA আপডেট করার সময় প্রতিবার এই সল্ট আবার তৈরি করা উচিত।

সল্ট ব্যবহার করে অ্যাকাউন্ট কী ফিল্টার তৈরি করতে:

  1. র‍্যান্ডম ২-বাইট S জেনারেট করুন। মনে রাখবেন যে এই ভ্যালুর কোনও "এন্ডিয়াননেস" নেই, কারণ এতে কোনও কম বা বেশি গুরুত্বপূর্ণ বাইট নেই — বাইটের ক্রম পরিবর্তন করবেন না।
  2. সল্ট হিসেবে ২-বাইট S ব্যবহার করুন।
  3. বিজ্ঞাপিত 'দ্রুত পেয়ার' অ্যাকাউন্ট ডেটাতে, তৈরি করা ফিল্টারটি অ্যাকাউন্ট কী ফিল্টার ফিল্ডে এবং সল্ট ফিল্ডে S অন্তর্ভুক্ত করুন।