सेवा देने वाली कंपनी के विज्ञापन सिग्नल
विज्ञापन: खोजे जाने पर
जब सेवा देने वाले डिवाइस को बीआर/ईडीआर खोजा जा सकता है (यानी, दूसरे डिवाइस से जोड़ने वाले मोड में), तब वह BLE पर फ़ास्ट पेयर मॉडल आईडी डेटा का विज्ञापन दिखाएगा. साथ ही, BLE पता नहीं घुमाया जाएगा.
विज्ञापन का अंतराल: खोजे जाने लायक होने पर
विज्ञापनों के बीच का अंतराल 100 मिलीसेकंड (10 हर्ट्ज़) से ज़्यादा नहीं होना चाहिए. धीमी रफ़्तार वाले मोड में स्कैन करने पर भी, तेज़ी से काम करने वाला व्यक्ति, सेवा देने वाली कंपनी को तेज़ी से ढूंढ सकता है.
विज्ञापन पेलोड: फ़ास्ट पेयर मॉडल आईडी का डेटा
विज्ञापन में, सेवा से जुड़े डेटा का टाइप शामिल होगा. उदाहरण के लिए, § 1.11. यूयूआईडी, 0xFE2C
की फ़ास्ट पेयर सेवा का यूयूआईडी होना चाहिए. सेवा से जुड़े डेटा में
ये चीज़ें शामिल होंगी:
ऑक्टेट | डेटा टाइप | ब्यौरा | वैल्यू |
---|---|---|---|
0-2 | uint24 |
24-बिट मॉडल आईडी | अलग-अलग हो सकता है |
विज्ञापन: खोजे जाने लायक न होने पर
अगर खोजा नहीं जा सकता (यानी, जोड़ने वाले मोड में नहीं है), तो सेवा देने वाली कंपनी के डिवाइस को नीचे दिए गए दिशा-निर्देशों का पालन करते हुए, फ़ास्ट पेयर खाते के डेटा का विज्ञापन दिखाना होगा.
खाते के डेटा का विज्ञापन करने से, आस-पास के सीकर को पता चल जाता है कि सेवा देने वाली कंपनी कब उसका खाता है. साथ ही, वे उसे दूसरे डिवाइस से जोड़ने वाले मोड में वापस लाए बिना, पेयरिंग शुरू कर सकते हैं. यह उपयोगकर्ता की शिकायत की एक आम वजह है. अगर उपयोगकर्ता, ब्रॉडकास्ट करने वाले के साथ जुड़ने के लिए इंतज़ार नहीं करते या ब्रॉडकास्ट काम का नहीं है (उदाहरण के लिए, अगर वे पहले से ही टीवी के साथ जुड़े हुए हों), तो वे इस ब्रॉडकास्ट को अनदेखा करने का विकल्प देंगे. खोजने वाले, साफ़ तौर पर खराब ब्रॉडकास्ट को भी अपने-आप फ़िल्टर कर देंगे. जैसे, खाते का डेटा गलत तरीके से कॉन्फ़िगर होने पर.
विज्ञापन का अंतराल: खोजे जाने लायक न होने पर
विज्ञापनों के बीच का अंतराल ज़्यादा से ज़्यादा 250 मिलीसेकंड (4 हर्ट्ज़) का होना चाहिए.
विज्ञापन पेलोड: फ़ास्ट पेयर खाते का डेटा
विज्ञापन में, सेवा से जुड़े डेटा का टाइप, Ibid शामिल होगा. § 1.11. यूयूआईडी, 0xFE2C
की फ़ास्ट पेयर सेवा का यूयूआईडी होना चाहिए. सेवा से जुड़े डेटा में
ये चीज़ें शामिल होंगी:
ऑक्टेट | डेटा टाइप | ब्यौरा | वैल्यू |
---|---|---|---|
0 | uint8 |
वर्शन और फ़्लैग 0bVVVFFFF
|
0x00 (आने वाले समय में इस्तेमाल के लिए रिज़र्व किया गया) |
1 - अलग-अलग हो सकता है | खाते के कुंजी का डेटा | अलग-अलग हो सकती है या खाता कुंजी सूची खाली होने पर 0x00 |
खाता कुंजी के डेटा में ये चीज़ें शामिल हैं:
ऑक्टेट | डेटा टाइप | ब्यौरा | वैल्यू |
---|---|---|---|
0 | uint8 |
फ़ील्ड की लंबाई और टाइप 0bLLLLTTTT
|
0bLL0000
|
1 - से | खाता कुंजी का फ़िल्टर | अलग-अलग हो सकता है | |
s + 1 | uint8 |
फ़ील्ड की लंबाई और टाइप 0bLLLLTTTT
|
0b00100001
|
s + 2 - s + 3 | uint16 |
Salt | अलग-अलग हो सकता है |
खाता कुंजी का फ़िल्टर
विज्ञापन दिए गए खाता कुंजी फ़िल्टर की मदद से, नौकरी देने वाले व्यक्ति को आगे की इंटरैक्शन से पहले तुरंत यह देखने की अनुमति मिलती है कि सेवा देने वाले के पास कोई खास खाता कुंजी (गलत-पॉज़िटिव होने की कम संभावना है, औसतन 0.5% से भी कम) है या नहीं. जब किसी फ़िल्टर को टाइप 0 से ब्रॉडकास्ट किया जा रहा होता है, जैसे कि यूज़र इंटरफ़ेस (यूआई) का संकेत दिखता है, जिसमें संभावित रूप से उसकी एक खाता कुंजी शामिल होती है, ताकि गलत पॉज़िटिव की दर को और कम किया जा सके, तो नौकरी ढूंढने वाला अपने-आप कनेक्ट हो सकता है और प्रोसेस शुरू करने की कोशिश कर सकता है. कुछ स्थितियों में, हो सकता है कि सेवा देने वाली कंपनी, जोड़े जाने के लिए तैयार न होने पर भी सीकर से उसकी पहचान करना चाहे. एक उदाहरण यह है कि जब ईयरबड को वापस केस में लगाया जाता है, तो हम दूसरे डिवाइस से जोड़ने की सूचना दिखाना बंद करना चाहते हैं. ऐसा इसलिए है, क्योंकि हेडसेट की ओर से जोड़े जाने की प्रोसेस को अस्वीकार किया जा सकता है.
खाता कुंजी फ़िल्टर, अलग-अलग लंबाई वाला ब्लूम फ़िल्टर है जो इस तरह बनाया जाता है:
- खाता कुंजी की सूची में मौजूद खाता कुंजियों (n >= 1) की संख्या n होने दें.
- s को बाइट में फ़िल्टर का साइज़ (1.2*n + 3) छोटा करने दें. उदाहरण
के लिए, अगर 1 कुंजी मौजूद है, तो s = 4 बाइट है.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- फ़िल्टर F को s बाइट की ऐरे के तौर पर शुरू करें. हर फ़िल्टर की वैल्यू 0 पर सेट होती है.
uint8_t F[s] = {0};
मौजूदा खाता कुंजी की सूची में मौजूद हर खाता कुंजी K के लिए:
a. 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; ... }
b. SHA256 का इस्तेमाल करके हैश V, 32-बाइट वैल्यू H = {H0, ..., H31} पाना.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. 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); }
d. हर X के लिएi:
i. M को फ़िल्टर में बिट की संख्या को Xi मॉड्यूलो, (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 शामिल करें. ध्यान दें कि इस वैल्यू में कोई "एंडियननेस" नहीं है, क्योंकि कोई ज़्यादा या कम अहम बाइट नहीं है—बाइट ऑर्डर को न बदलें.
नमक का खेत
सॉल्ट एक रैंडम वैल्यू है, जिसे ब्लूम फ़िल्टर बनाते समय खाता कुंजियों में जोड़ा जाता है. सेवा देने वाली कंपनी के लिए आरपीए को जब भी अपडेट किया जाता है, तब यह सॉल्ट फिर से जनरेट होना चाहिए, ताकि पते के रोटेशन से जुड़ी ट्रैकिंग को रोका जा सके.
सॉल्ट का इस्तेमाल करके खाता कुंजी फ़िल्टर जनरेट करने के लिए:
- रैंडम तरीके से दो-बाइट का S जनरेट करें. ध्यान दें कि इस वैल्यू में कोई "एंडियननेस" नहीं है, क्योंकि कोई कम या ज़्यादा अहम बाइट नहीं है — बाइट ऑर्डर में बदलाव न करें.
- 2-बाइट S को सॉल्ट के तौर पर इस्तेमाल करें.
- विज्ञापन में दिखाए गए फ़ास्ट पेयर खाते के डेटा में, जनरेट किया गया फ़िल्टर, खाता कुंजी के फ़िल्टर फ़ील्ड में और सॉल्ट फ़ील्ड में S शामिल करें.