सेवा देने वाली कंपनी के विज्ञापन से जुड़ा सिग्नल

विज्ञापन: खोजे जाने लायक होने पर

जब प्रोवाइडर डिवाइस, बीआर/ईडीआर की मदद से खोजे जाने लायक होता है (यानी कि दूसरे डिवाइस से जोड़ने वाले मोड में होता है), तो उसे BLE पर फ़ास्ट पेयर मॉडल आईडी डेटा का विज्ञापन दिखाना चाहिए. साथ ही, BLE पता नहीं बदलना चाहिए.

विज्ञापन दिखाने का इंटरवल: खोजे जाने लायक होने पर

विज्ञापनों के बीच का इंटरवल 100 मि॰से॰ (10 हर्ट्ज़) से ज़्यादा नहीं होना चाहिए. तेज़ दर की वजह से, सीकर को प्रोवाइडर को तेज़ी से ढूंढने में मदद मिलती है. भले ही, स्कैनिंग कम पावर वाले मोड में की जा रही हो.

विज्ञापन पेलोड: फ़ास्ट पेयर मॉडल आईडी डेटा

विज्ञापन में सर्विस डेटा का डेटा टाइप होना चाहिए, ibid., § 1.11. UUID, 0xFE2C की फ़ास्ट पेयर सेवा का UUID होना चाहिए. सेवा से जुड़े डेटा में यह जानकारी शामिल होनी चाहिए:

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0-2 uint24 24-बिट मॉडल आईडी अलग-अलग

एलई ऑडियो शेयर करने की सुविधा के विज्ञापन का पेलोड: फ़ास्ट पेयर मॉडल आईडी डेटा और एफ़पी की क्षमता का मैप

सेवा से जुड़े डेटा में ये शामिल होंगे:

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 uint8 वर्शन और फ़्लैग
0bVVVVFFFF
  • V = वर्शन
  • F = फ़्लैग
0x00
1 uint8 फ़ील्ड की लंबाई और टाइप
0bLLLLTTTT
  • L = मॉडल आईडी की लंबाई (बाइट में)
  • T = type
0bLLLL0111
  • length = 0bLLLL = अलग-अलग
  • type = 0b0111, मॉडल आईडी
2 - s मॉडल आईडी अलग-अलग
s + 1 uint8 फ़ील्ड की लंबाई और टाइप
0bLLLLTTTT
  • L = बाइट में लंबाई
  • T = type
0bLLLL1000
  • length = 0bLLLL = अलग-अलग, फ़िलहाल 1
  • type = 0b1000, FP Capability Map
s + 2 uint8 FP Capability Map अलग-अलग
FP Capability Map

एफ़पी कैपेबिलिटी मैप एक बिट मैप है. इससे पता चलता है कि सेवा देने वाली कंपनी, एफ़पी की कौनसी सुविधाएं उपलब्ध कराती है. बिटमैप की पहली बाइट को इस तरह से तय किया जाता है:

बिट मैप ब्यौरा
0bRRRRRRSO R - रिज़र्व बिट, इसे सीकर फ़िलहाल अनदेखा कर देगा और इसे 0 पर सेट किया जाएगा.
S - एफ़पी एलई ऑडियो शेयर करने की सुविधा (चालू होने पर 1 पर सेट करें, नहीं तो 0 पर सेट करें).
O - आउट ऑफ़ बॉक्स (ओओबी) बिट, अगर डिवाइस फ़ैक्ट्री न्यू है, तो इसे 1 पर सेट करें.

अगर सेवा देने वाली कंपनी, एफ़पी एलई ऑडियो शेयर करने की सुविधा के साथ काम करती है, तो इसका मतलब है कि वह कुछ समय के लिए पेयर करने की सुविधा, एलई ऑडियो शेयर करने की सुविधा के विज्ञापन पेलोड, और कान में लगाए जाने वाले डिवाइस के कंट्रोल के वर्शन 2 के साथ काम करती है. इसके लिए, एफ़पी एलई ऑडियो शेयर करने की सुविधा के बिट को 1 पर सेट करें. अगर ऐसा नहीं है, तो इसे 0 पर सेट करें.

अगर प्रोवाइडर को किसी भी एफ़पी सीकर के साथ जोड़ा नहीं गया है और वह फ़ैक्ट्री न्यू है (इसका मतलब है कि प्रोवाइडर पर कोई एफ़पी खाता कुंजी नहीं है), तो ओओबी बिट को 1 पर सेट करें. ऐसा न होने पर, इसे 0 पर सेट करें.

कोऑर्डिनेटेड सेट की जानकारी देने वाला विज्ञापन पेलोड: फ़ास्ट पेयर मॉडल आईडी डेटा और एफ़पी कोऑर्डिनेटेड सेट की जानकारी

सेवा से जुड़े डेटा में ये शामिल होंगे:

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 uint8 वर्शन और फ़्लैग
0bVVVVFFFF
  • V = वर्शन
  • F = फ़्लैग
0x00
1 uint8 फ़ील्ड की लंबाई और टाइप
0bLLLLTTTT
  • L = मॉडल आईडी की लंबाई (बाइट में)
  • T = type
0bLLLL0111
  • length = 0bLLLL = अलग-अलग
  • type = 0b0111, मॉडल आईडी
2 - s मॉडल आईडी अलग-अलग
s + 1 uint8 फ़ील्ड की लंबाई और टाइप
0bLLLLTTTT
  • L = कोऑर्डिनेट किए गए सेट डेटा की लंबाई
  • T = type
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 FP Coordinated Set Data 6-बाइट डेटा, एफ़पी कोऑर्डिनेटेड सेट की जानकारी देखें
FP Coordinated Set Info

एफ़पी कोऑर्डिनेटेड सेट की जानकारी का इस्तेमाल यह पता लगाने के लिए किया जाता है कि विज्ञापन दिखाने वाला डिवाइस, उसी कोऑर्डिनेटेड सेट में है या नहीं.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 uint8 एक जैसे सेट का साइज़ बदलता रहता है
1 uint8 फ़ास्ट पेयर की सुविधा वाले कोऑर्डिनेटेड सेट के सदस्य का टाइप इनमें से कोई एक हो सकता है
  • 0x00 : बायां कॉम्पोनेंट
  • 0x01 : दायां कॉम्पोनेंट
2 - 5 uint32 पहचान की पुष्टि करने वाली कुंजी का हैश सेट करें बदलता रहता है

सेट आइडेंटिटी रिज़ॉल्विंग कुंजी की हैश वैल्यू जनरेट करने का एल्गोरिदम

  • एसआईआके वैल्यू को हैश करने के लिए, SHA256 का इस्तेमाल करना

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • हैश वैल्यू के तौर पर पहले चार बाइट निकालें

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Set Identity Resolving Key के बारे में ज़्यादा जानकारी के लिए, Coordinated Set Identification Service देखें.

विज्ञापन: जब खोजे जाने लायक न हो

जब सेवा देने वाली कंपनी का डिवाइस खोजे जाने लायक न हो (यानी कि दूसरे डिवाइस से जोड़ने वाले मोड में न हो), तो उसे इन दिशा-निर्देशों का इस्तेमाल करके, फ़ास्ट पेयर की सुविधा वाले खाते में मौजूद डेटा का विज्ञापन दिखाना चाहिए.

खाते में मौजूद डेटा को विज्ञापन के तौर पर दिखाने से, आस-पास मौजूद सीकर डिवाइसों को यह पता चल जाता है कि प्रोवाइडर डिवाइस उनके खाते से जुड़ा है या नहीं. साथ ही, वे प्रोवाइडर डिवाइस को फिर से दूसरे डिवाइस से जोड़ने वाले मोड में डाले बिना, उसे कनेक्ट कर सकते हैं. आम तौर पर, उपयोगकर्ता इस बात की शिकायत करते हैं कि उन्हें प्रोवाइडर डिवाइस को फिर से दूसरे डिवाइस से जोड़ने वाले मोड में डालना पड़ता है. सीकर, उपयोगकर्ताओं को इस ब्रॉडकास्ट को अनदेखा करने का विकल्प देंगे. ऐसा तब होगा, जब वे प्रोवाइडर के साथ जुड़ने का इंतज़ार नहीं करना चाहते या ब्रॉडकास्ट काम का नहीं है. उदाहरण के लिए, अगर वे पहले ही जुड़ चुके हैं. सीकर, खराब ब्रॉडकास्ट को अपने-आप फ़िल्टर कर देंगे. जैसे, जब खाते में मौजूद डेटा को गलत तरीके से कॉन्फ़िगर किया गया हो.

विज्ञापन दिखाने का इंटरवल: जब डिवाइस खोजे जाने लायक न हो

विज्ञापनों के बीच का इंटरवल ज़्यादा से ज़्यादा 250 मि॰से॰ (4 हर्ट्ज़) होना चाहिए.

विज्ञापन पेलोड: फ़ास्ट पेयर खाते में मौजूद डेटा

विज्ञापन में सेवा से जुड़े डेटा का डेटा टाइप शामिल होना चाहिए, Ibid., § 1.11. UUID, 0xFE2C की फ़ास्ट पेयर सेवा का UUID होना चाहिए. सेवा से जुड़े डेटा में यह जानकारी शामिल होनी चाहिए:

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 uint8 वर्शन और फ़्लैग
0bVVVVFFFF
  • V = वर्शन
  • F = फ़्लैग
0x00
(आने वाले समय में इस्तेमाल के लिए रिज़र्व रखा गया है)
1 - अलग-अलग खाते की कुंजी का डेटा अलग-अलग

खाते के मुख्य डेटा में ये शामिल हैं:

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 uint8 फ़ील्ड की लंबाई और टाइप
0bLLLLTTTT
  • L = बाइट में खाता कुंजी फ़िल्टर की लंबाई
  • T = type
0bLLLL0000
  • length = 0bLLLL = अलग-अलग
  • type = 0b0000 (यूज़र इंटरफ़ेस (यूआई) का इंडिकेशन दिखाएं) या 0b0010 (यूज़र इंटरफ़ेस (यूआई) का इंडिकेशन छिपाएं), खाते की कुंजी का फ़िल्टर
1 - s खाते की कुंजी के हिसाब से फ़िल्टर करना अलग-अलग
s + 1 uint8 फ़ील्ड की लंबाई और टाइप
0bLLLLTTTT
  • L = बाइट में लंबाई
  • T = type
0b00100001
  • लंबाई = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt अलग-अलग

खाते की कुंजी के हिसाब से फ़िल्टर करना

विज्ञापन में दिखाए गए खाते की कुंजी के फ़िल्टर की मदद से, सीकर तुरंत यह पता लगा सकता है कि प्रोवाइडर के पास खाते की कोई कुंजी है या नहीं. इसके बाद ही, वह आगे की बातचीत करता है. इसमें गलत-पॉज़िटिव की संभावना कम होती है. औसतन, यह संभावना 0.5% से भी कम होती है. जब सीकर को टाइप 0 के साथ ब्रॉडकास्ट किया जा रहा फ़िल्टर दिखता है, तो वह अपने-आप कनेक्ट हो सकता है और प्रोसेस शुरू करने की कोशिश कर सकता है.टाइप 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 के लिए:
    a. मान लें कि 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;
          ... }
    

    b. SHA256 का इस्तेमाल करके, हैश V से 32-बाइट की वैल्यू H = {H0, …, H31} मिलती है.

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

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

    d. हर Xi के लिए:
    i. मान लें कि M, फ़िल्टर में बिट की संख्या का Xi मॉड्यूलो है, (s * 8).
    ii. इंडेक्स (M / 8) पर F में बाइट पाएं. इसे राउंड डाउन किया गया है.
    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 को शामिल करें. ध्यान दें कि इस वैल्यू में कोई "एंडियननेस" नहीं है, क्योंकि इसमें कोई ज़्यादा या कम अहम बाइट नहीं है. इसलिए, बाइट के क्रम में बदलाव न करें.

नमक का खेत

सॉल्ट एक रैंडम वैल्यू होती है. ब्लूम फ़िल्टर बनाते समय, इसे खाते की कुंजियों में जोड़ा जाता है. जब भी सेवा देने वाली कंपनी के लिए आरपीए को अपडेट किया जाए, तब इस सॉल्ट को फिर से जनरेट किया जाना चाहिए. इससे, पते के रोटेशन के दौरान ट्रैकिंग से बचा जा सकता है.

सॉल्ट का इस्तेमाल करके, खाते की कुंजी का फ़िल्टर जनरेट करने के लिए:

  1. दो बाइट का कोई भी S जनरेट करें. ध्यान दें कि इस वैल्यू के लिए कोई "एंडियननेस" नहीं है, क्योंकि इसमें कोई भी बाइट ज़्यादा या कम अहम नहीं है. इसलिए, बाइट के क्रम में बदलाव न करें.
  2. सॉल्ट के तौर पर, दो बाइट वाले S का इस्तेमाल करें.
  3. विज्ञापन के तौर पर दिखाए गए फ़ास्ट पेयर खाते में मौजूद डेटा में, जनरेट किए गए फ़िल्टर को खाते की कुंजी के फ़िल्टर फ़ील्ड में शामिल करें. साथ ही, सॉल्ट फ़ील्ड में S को शामिल करें.