ब्लूटूथ ले इतना डरावना नहीं है, या बहुत प्रयास के बिना उपयोगकर्ता के अनुभव को कैसे बेहतर बनाया जाए

हाल ही में, हमारी टीम ने ब्लूटूथ ले तकनीक का उपयोग करके हवा द्वारा धन हस्तांतरित करने के कार्य को लागू किया। मैं आपको यह बताना चाहता हूं कि हमने यह कैसे किया और Apple हमें टूल्स से क्या प्रदान करता है। कई डेवलपर्स सोचते हैं कि ब्लूटूथ मुश्किल है, क्योंकि यह एक निम्न-स्तरीय प्रोटोकॉल है, और इस पर कई विशेषज्ञ नहीं हैं। लेकिन सब कुछ इतना डरावना नहीं है, और वास्तव में, इस फ़ंक्शन का उपयोग करना बहुत सरल है! और उन कार्यों को जो ब्लूटूथ ले का उपयोग करके कार्यान्वित किया जा सकता है, निश्चित रूप से दिलचस्प हैं और बाद में प्रतियोगियों के बीच आपके आवेदन को उजागर करेंगे।



आइए पहले समझते हैं कि यह किस तरह की तकनीक है और क्लासिक ब्लूटूथ से इसका अंतर क्या है।

ब्लूटूथ ले क्या है?


ब्लूटूथ डेवलपर्स ने इस तकनीक का नाम कम ऊर्जा क्यों रखा? आखिरकार, ब्लूटूथ के प्रत्येक नए संस्करण के साथ, बिजली की खपत पहले से कई गुना कम थी। जवाब इस बैटरी में निहित है।


इसका व्यास केवल 2 सेमी है, और क्षमता लगभग 220 एमए * एच है। जब इंजीनियरों ने ब्लूटूथ ले विकसित किया, तो वे चाहते थे कि इस तरह की बैटरी के साथ डिवाइस कई वर्षों तक काम करे। और उन्होंने ऐसा किया! ऐसी बैटरी के साथ ब्लूटूथ LE डिवाइस एक साल तक काम कर सकते हैं। आप में से कितने लोग अभी भी अपने फोन पर ब्लूटूथ को पुराने जमाने के तरीके से बंद कर रहे हैं ऊर्जा बचाने के लिए, जैसा कि आपने 2000 में किया था? व्यर्थ में आप ऐसा करते हैं - बचत प्रति दिन फोन के 10 सेकंड से कम होगी। और आप बहुत बड़ी कार्यक्षमता को अक्षम करते हैं, जैसे कि हैंडऑफ़, एयरड्रॉप और अन्य।

ब्लूटूथ LE विकसित करके इंजीनियरों ने क्या हासिल किया? क्या उन्होंने क्लासिक प्रोटोकॉल को परिष्कृत किया है? इसे और अधिक ऊर्जा कुशल बनाया? बस सभी प्रक्रियाओं को अनुकूलित किया? नहीं। उन्होंने ब्लूटूथ स्टैक की वास्तुकला को पूरी तरह से बदल दिया और इस तथ्य को प्राप्त किया कि अब, अन्य सभी उपकरणों को दिखाई देने के लिए, आपको हवा में रहने और चैनल पर कब्जा करने के लिए कम समय की आवश्यकता होती है। बदले में, इसने ऊर्जा की खपत पर अच्छी बचत की अनुमति दी। और नई वास्तुकला के साथ, किसी भी नए डिवाइस को अब मानकीकृत किया जा सकता है, जिसके लिए दुनिया भर के डेवलपर्स डिवाइस के साथ संवाद कर सकते हैं और इसलिए, इसे प्रबंधित करने के लिए आसानी से नए एप्लिकेशन लिख सकते हैं। इसके अलावा, स्व-खोज का सिद्धांत वास्तुकला में अंतर्निहित है: किसी डिवाइस से कनेक्ट करते समय, आपको किसी भी पिन कोड को दर्ज करने की आवश्यकता नहीं होती है, और यदि आपका एप्लिकेशन इस डिवाइस के साथ संचार कर सकता है, तो कनेक्शन मिलीसेकंड की बात करता है।

  • हवा पर कम समय।
  • बिजली की कम खपत।
  • नई वास्तुकला।
  • कनेक्शन समय कम कर दिया।

इंजीनियरों ने ऊर्जा दक्षता में इतनी बड़ी छलांग लगाने का प्रबंधन कैसे किया?

आवृत्ति समान रही: 2.4 गीगा, प्रमाणित नहीं और कई देशों में उपयोग के लिए मुफ्त। लेकिन कनेक्शन की देरी कम हो गई है: क्लासिक ब्लूटूथ के साथ 100 एमएस के बजाय 15-30 एमएस। काम की दूरी समान रही - 100 मीटर। संचरण अंतराल मजबूत नहीं था, लेकिन परिवर्तित - 0.625 एमएस के बजाय, यह 3 एमएस बन गया।

लेकिन इसकी वजह से ऊर्जा की खपत दस गुना कम नहीं हो सकी। बेशक, कुछ भुगतना पड़ा। और यह गति है: 24 एमबीपीएस के बजाय, यह 0.27 एमबीपीएस हो गया। आप शायद कहेंगे कि यह 2018 के लिए हास्यास्पद गति है।

ब्लूटूथ ले का उपयोग कहाँ किया जाता है?




यह तकनीक युवा नहीं है, यह पहली बार iPhone 4s में दिखाई दिया। और पहले से ही कई क्षेत्रों को जीतने में कामयाब रहा। ब्लूटूथ ले का उपयोग सभी स्मार्ट घरेलू उपकरणों और पहनने योग्य इलेक्ट्रॉनिक्स में किया जाता है। अब चिप्स भी हैं कॉफी बीन्स के आकार।



और इस तकनीक को सॉफ्टवेयर में कैसे लागू किया जाता है?

चूंकि Apple अपने डिवाइस में ब्लूटूथ को एकीकृत करने और इसका उपयोग शुरू करने के लिए सबसे पहले था, अब तक उन्होंने अपने पारिस्थितिकी तंत्र में अच्छी प्रगति और एकीकृत तकनीक बनाई है। और अब आप इस तकनीक को एयरड्रॉप, डिवाइसेज क्विक स्टार्ट, शेयर पासवर्ड, हैंडऑफ जैसी सेवाओं में मिल सकते हैं। और यहां तक ​​कि घड़ी में सूचनाएं ब्लूटूथ ले के माध्यम से बनाई गई हैं। इसके अलावा, Apple ने यह सुनिश्चित करने के लिए सार्वजनिक रूप से उपलब्ध दस्तावेज बनाये हैं कि कैसे सुनिश्चित करें कि सभी एप्लिकेशन के नोटिफिकेशन आपके स्वयं के उपकरणों पर आते हैं। ब्लूटूथ ले के भीतर उपकरणों की भूमिका क्या है?



प्रसारणकर्ता। सभी को संदेश भेजता है जो पास में है, आप इस उपकरण से कनेक्ट नहीं कर सकते। इस सिद्धांत के अनुसार, iBeacons और इनडोर नेविगेशन काम करते हैं।

ऑब्जर्वर। जो कुछ भी हो रहा है उसे सुनता है, और केवल सार्वजनिक संदेशों से डेटा प्राप्त करता है। संबंध नहीं बनाता है।

लेकिन मध्य और परिधीय के साथ और अधिक दिलचस्प। उन्हें केवल सर्वर-क्लाइंट क्यों नहीं कहा गया? तार्किक रूप से, नाम से देखते हुए। लेकिन नहीं।

क्योंकि पेरिफेरल वास्तव में एक सर्वर के रूप में कार्य करता है। यह एक परिधीय उपकरण है जो कम बिजली की खपत करता है और अधिक शक्तिशाली सेंट्रल से जोड़ता है। पेरिफेरल आपको सूचित कर सकता है कि यह पास है और इसकी क्या सेवाएँ हैं। केवल एक उपकरण इससे जुड़ सकता है, और पेरिफेरल में कुछ डेटा होता है। और सेंट्रल उपकरणों की खोज में हवा को स्कैन कर सकता है, कनेक्शन अनुरोध भेज सकता है, किसी भी संख्या में उपकरणों से जुड़ सकता है, पेरिफेरल से डेटा पढ़ सकता है, लिख सकता है और सदस्यता ले सकता है।

डेवलपर्स के रूप में एप्पल इकोसिस्टम में हमारी पहुंच क्या है?

हमारे लिए क्या उपलब्ध है?


iOS / Mac OS:

  • परिधीय और मध्य।
  • बैकग्राउंड मोड।
  • राज्य की वसूली।
  • कनेक्शन अंतराल 15 एमएस।

घड़ी / टीवीओएस:

  • घड़ी 4+ / टीवीओएस 9+।
  • केवल मध्य।
  • अधिकतम दो कनेक्शन।
  • Apple घड़ी श्रृंखला 2+ / AppleTv 4+।
  • पृष्ठभूमि में प्रवेश करते समय शटडाउन करें।
  • कनेक्शन अंतराल 30 एमएस।

सबसे महत्वपूर्ण अंतर कनेक्शन अंतराल है। क्या असर पड़ता है? इस प्रश्न का उत्तर देने के लिए, आपको सबसे पहले यह समझने की आवश्यकता है कि ब्लूटूथ ले प्रोटोकॉल कैसे काम करता है और पूर्ण मूल्यों में इतना छोटा अंतर क्यों महत्वपूर्ण है।

प्रोटोकॉल कैसे काम करता है


खोज और कनेक्शन की प्रक्रिया कैसी है?

परिधीय विज्ञापन अंतराल की आवृत्ति पर अपनी उपस्थिति की घोषणा करता है, इसका पैकेज बहुत छोटा है और इसमें डिवाइस द्वारा प्रदान किए जाने वाले कुछ सेवा पहचानकर्ता, साथ ही डिवाइस का नाम भी शामिल है। अंतराल काफी बड़ा हो सकता है और डिवाइस की वर्तमान स्थिति, बिजली की बचत मोड और अन्य सेटिंग्स के आधार पर भिन्न हो सकता है। Apple बाहरी उपकरणों के डेवलपर्स को एक्सीलरोमीटर तक अंतराल की लंबाई को टाई करने की सलाह देता है: यदि डिवाइस का उपयोग नहीं किया गया है, तो अंतराल को बढ़ाएं और जब यह सक्रिय हो, तो डिवाइस को खोजने के लिए कम करें। विज्ञापन-अंतराल कनेक्शन अंतराल के साथ संबद्ध नहीं होता है और यह डिवाइस द्वारा स्वयं निर्धारित किया जाता है, जो बिजली की खपत और इसकी सेटिंग्स पर निर्भर करता है। यह Apple इकोसिस्टम में हमारे लिए दुर्गम और अज्ञात है, यह पूरी तरह से सिस्टम द्वारा नियंत्रित है।



डिवाइस खोजने के बाद, हम एक कनेक्शन अनुरोध भेजते हैं, और यहां कनेक्शन अंतराल दृश्य में प्रवेश करता है - वह समय जिसके बाद दूसरा डिवाइस अनुरोध का जवाब दे सकता है। लेकिन यह तब होता है जब कनेक्ट होता है, लेकिन पढ़ते / लिखते समय क्या होता है?



डेटा पढ़ते समय कनेक्शन अंतराल भी दिखाई देता है - इसे 2 गुना कम करने से डेटा ट्रांसफर दर बढ़ जाती है। लेकिन आपको यह समझने की आवश्यकता है कि यदि दोनों डिवाइस एक ही अंतराल का समर्थन नहीं करते हैं, तो उनमें से अधिकतम का चयन किया जाएगा।

आइए देखें कि पेरिफेरल पास के बारे में जानकारी का एक पैकेज क्या है।

इस तरह के पैकेज का MTU (अधिकतम संचरण इकाई) कनेक्शन प्रक्रिया के दौरान निर्धारित किया जाता है और डिवाइस से डिवाइस और ऑपरेटिंग सिस्टम पर निर्भर करता है। प्रोटोकॉल संस्करण 4.0 में, MTU लगभग 30 था, और पेलोड का आकार 20 बाइट्स से अधिक नहीं था। संस्करण 4.2 में, सब कुछ बदल गया है, अब आप लगभग 520 बाइट्स स्थानांतरित कर सकते हैं। लेकिन, दुर्भाग्य से, iPhone 5s से कम उम्र के केवल डिवाइस प्रोटोकॉल के इस संस्करण का समर्थन करते हैं। ओवरहेड का आकार, MTU के आकार की परवाह किए बिना, 7 बाइट्स है: इसमें ATT और L2CAP हेडर शामिल हैं। रिकॉर्ड के साथ, सामान्य तौर पर, एक समान स्थिति।



केवल दो मोड हैं: उत्तर के साथ और बिना। अनुत्तरित मोड डेटा ट्रांसफर में काफी तेजी लाता है, क्योंकि अगली रिकॉर्डिंग से पहले कोई प्रतीक्षा अंतराल नहीं है। लेकिन यह मोड हमेशा उपलब्ध नहीं है, सभी उपकरणों पर नहीं और सभी प्रणालियों पर नहीं। इस रिकॉर्डिंग मोड में प्रवेश सिस्टम द्वारा ही सीमित हो सकता है, क्योंकि इसे कम ऊर्जा-कुशल माना जाता है। आईओएस में, एक विधि है जिसमें आप रिकॉर्डिंग से पहले जांच सकते हैं कि क्या यह मोड उपलब्ध है।

अब देखते हैं कि प्रोटोकॉल में क्या होता है।



प्रोटोकॉल 5 स्तरों के होते हैं। अनुप्रयोग परत आपके तर्क है, जो CoreBluaxy के शीर्ष पर वर्णित है। GATT (जेनेरिक एट्रीब्यूट्स लेयर) का उपयोग सेवाओं और विशेषताओं के आदान-प्रदान के लिए किया जाता है जो उपकरणों पर होती हैं। ATT (Attributes Layer) का उपयोग आपकी विशेषताओं को प्रबंधित करने और आपके डेटा को स्थानांतरित करने के लिए किया जाता है। L2CAP एक निम्न-स्तरीय डेटा एक्सचेंज प्रोटोकॉल है। नियंत्रक बीटी चिप ही है।

आप शायद पूछें कि गैट क्या है और हम इसके साथ कैसे काम कर सकते हैं?

GATT में सुविधाएँ और सेवाएँ शामिल हैं। एक विशेषता एक वस्तु है जिसमें आपका डेटा एक चर की तरह संग्रहीत होता है। और एक सेवा एक समूह है जिसमें आपकी विशेषताएं स्थित हैं, जैसे नाम स्थान। सेवा का एक नाम है - यूयूआईडी, आप इसे स्वयं चुनते हैं। एक सेवा में एक सहायक सेवा हो सकती है।



विशेषता का अपना यूयूआईडी भी है - वास्तव में, एक नाम। विशेषता का मूल्य NSData है, यहां आप डेटा रिकॉर्ड और स्टोर कर सकते हैं। डिस्क्रिप्टर्स आपकी विशेषता का विवरण है, आप वर्णन कर सकते हैं कि आप इस विशेषता में क्या डेटा की उम्मीद करते हैं, या उनका क्या मतलब है। ब्लूटूथ प्रोटोकॉल में कई डिस्क्रिप्टर हैं, लेकिन अभी तक केवल दो ही एप्पल सिस्टम पर उपलब्ध हैं: मानव विवरण और डेटा प्रारूप। आपकी सुविधा के लिए अनुमतियाँ भी हैं:



आइये इसे स्वयं आजमाते हैं


हमारे पास प्राप्तकर्ता से कुछ भी आवश्यकता के बिना हवा से पैसा स्थानांतरित करना संभव बनाने का विचार था। कल्पना कीजिए, आप एक बहुत ही दिलचस्प काम पर विचार कर रहे हैं, एकदम सही कोड लिख रहे हैं, और यहाँ एक सहयोगी कॉफी के लिए जा रहा है। और आप उस कार्य के बारे में इतने भावुक हैं कि आप दूर नहीं जा सकते हैं, और उसे आपसे एक कप स्वादिष्ट कैपुचीनो खरीदने के लिए कह सकते हैं। वह आपको कॉफी लाता है, और आपको उसे पैसे लौटाने की जरूरत है। आप फोन नंबर से अनुवाद कर सकते हैं, यह ठीक काम करता है। लेकिन यहाँ एक अजीब स्थिति है - आप उसकी संख्या नहीं जानते हैं। ठीक है, इस तरह, आप तीन साल से काम कर रहे हैं, लेकिन आपने संख्याओं का आदान-प्रदान नहीं किया है :)

इसलिए, हमने किसी भी उपयोगकर्ता डेटा को दर्ज किए बिना, जो पास में हैं, उनके लिए धन हस्तांतरण करना संभव बनाने का फैसला किया। जैसे AirDrop में। बस एक उपयोगकर्ता का चयन करें और उसकी ज़रूरत की राशि भेजें। आइए देखें कि हमें इसके लिए क्या चाहिए।



PUSH मैपिंग


हमें प्रेषक की आवश्यकता है:

  1. मैं सभी उपकरणों को ढूंढ सकता हूं जो पास हैं और हमारी सेवा का समर्थन करते हैं।
  2. मैं विवरण पढ़ सकता था।
  3. और वह प्राप्तकर्ता को एक संदेश भेज सकता है कि उसने सफलतापूर्वक उसे पैसे भेजे थे।

प्राप्तकर्ता, बदले में, आसपास के प्रेषकों को सूचित करने में सक्षम होना चाहिए कि उसके पास आवश्यक डेटा के साथ एक सेवा है, और प्रेषक से संदेश प्राप्त करने में सक्षम हो। मुझे लगता है कि यह बताने लायक नहीं है कि हमारे बैंक में विवरण द्वारा धन हस्तांतरित करने की प्रक्रिया कैसे होती है। अब इसे लागू करने का प्रयास करते हैं।

पहले आपको हमारी सेवा और विशेषताओं के नामों के साथ आने की आवश्यकता है। जैसा कि मैंने कहा, यह यूयूआईडी है। हम बस उन्हें उत्पन्न करते हैं और उन्हें पेरिफेरल और सेंट्रल पर सहेजते हैं ताकि वे दोनों उपकरणों पर समान हों।



आप किसी भी यूयूआईडी का उपयोग करने के लिए स्वतंत्र हैं, इस तरह से समाप्त होने के अलावा: XXXXXXXX- 0000-1000-8000-00805F9B34FB - वे विभिन्न कंपनियों के लिए आरक्षित हैं। आप स्वयं ऐसी संख्या खरीद सकते हैं और कोई भी इसका उपयोग नहीं करेगा। इसकी कीमत $ 2500 होगी।

अगला, हमें प्रबंधकों को बनाने की आवश्यकता होगी: एक धनराशि स्थानांतरित करने के लिए, दूसरा प्राप्त करने के लिए। आपको केवल प्रतिनिधियों को निर्दिष्ट करने की आवश्यकता है। हम सेंट्रल ट्रांसमिट करेंगे, पेरिफेरल प्राप्त करेंगे। हम दोनों बनाते हैं, क्योंकि प्रेषक और रिसीवर दोनों अलग-अलग समय पर एक व्यक्ति हो सकते हैं।



अब हमें प्राप्तकर्ता का पता लगाने और हमारी विशेषता में प्राप्तकर्ता के विवरण को लिखना संभव बनाने की आवश्यकता है।



सबसे पहले, एक सेवा बनाएँ। हम यूयूआईडी को पंजीकृत करेंगे और इंगित करेंगे कि यह प्राथमिक है - अर्थात, इस उपकरण के लिए सेवा मुख्य है। एक अच्छा उदाहरण: एक दिल की दर की निगरानी, ​​जिसके लिए वर्तमान हृदय गति मुख्य सेवा होगी, और बैटरी की स्थिति माध्यमिक जानकारी है।

अगला, हम दो विशेषताओं का निर्माण करते हैं: एक प्राप्तकर्ता का विवरण पढ़ने के लिए, दूसरा लेखन के लिए ताकि प्राप्तकर्ता पैसे भेजने के बारे में सीख सके। हम उन्हें अपनी सेवा में पंजीकृत करते हैं, फिर उन्हें प्रबंधक में जोड़ते हैं, खोज शुरू करते हैं और सेवा के यूयूआईडी को इंगित करते हैं ताकि पास में आने वाले सभी डिवाइस इसे कनेक्ट करने से पहले हमारी सेवा के बारे में पता लगा सकें। यह डेटा उस पैकेट में रखा जाता है जिसे सेंट्रल प्रसारण के दौरान भेजता है।

प्राप्तकर्ता तैयार है, प्रेषक के लिए आगे बढ़ें। खोज चलाएँ और कनेक्ट करें।



जब आप प्रबंधक चालू करते हैं, तो हम अपनी सेवा के साथ उपकरणों की खोज शुरू करते हैं। जब हम उन्हें ढूंढते हैं, तो हम उन्हें प्रतिनिधि विधि में प्राप्त करते हैं और तुरंत कनेक्ट करते हैं। महत्वपूर्ण: आपको उन सभी पेरिफेरल के लिए एक मजबूत लिंक बनाए रखने की आवश्यकता है जो आप के साथ काम करते हैं, अन्यथा वे लीक हो जाएंगे।



सफल कनेक्शन के बाद, हम उस प्रतिनिधि को कॉन्फ़िगर करते हैं जो इस उपकरण के साथ काम करेगा, और हमें उस सेवा की आवश्यकता है जो हमें डिवाइस से चाहिए।



हम प्राप्तकर्ता से सफलतापूर्वक जुड़ गए हैं, अब आपको इसके विवरण को पढ़ने की आवश्यकता है।

कनेक्ट करने के बाद, हमने पहले ही डिवाइस से सभी सेवाओं का अनुरोध किया है। और उन्हें प्राप्त करने के बाद, प्रतिनिधि विधि को बुलाया जाएगा, जो इस उपकरण पर उपलब्ध सभी सेवाओं को सूचीबद्ध करेगा। हम सही पाते हैं और इसकी विशेषताओं का अनुरोध करते हैं। परिणाम यूयूआईडी द्वारा प्रतिनिधि पद्धति में पाया जा सकता है, जो अनुवाद के लिए डेटा संग्रहीत करता है। हम उन्हें पढ़ने की कोशिश करते हैं, और हम फिर से प्रतिनिधि विधि में वांछित प्राप्त करते हैं। सभी सेवाओं, विशेषताओं और उनके मूल्यों को सिस्टम द्वारा कैश किया जाता है, इसलिए हर बार बाद में उन्हें अनुरोध करना आवश्यक नहीं है।



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

हमें प्रेषक से हमें वह विशेषता प्राप्त होती है, इस मामले में हमने इसे संग्रहीत मूल्य से लिया है। लेकिन इससे पहले, आपको इसे डिवाइस से प्राप्त करने की आवश्यकता है, जैसा कि हमने पहले किया था। और फिर वांछित विशेषता के लिए डेटा लिखें।

उसके बाद, अन्य डिवाइस पर, हमें प्रतिनिधि विधि में एक लिखित अनुरोध मिलता है। यहां आप उस डेटा को पढ़ सकते हैं जो आपको भेजा गया है, किसी भी त्रुटि का जवाब दें, उदाहरण के लिए, कोई एक्सेस नहीं है, या यह विशेषता मौजूद नहीं है। सब कुछ काम करेगा, लेकिन केवल अगर दोनों डिवाइस चालू हैं और एप्लिकेशन सक्रिय हैं। और हमें पृष्ठभूमि में काम करने की आवश्यकता है!



Apple आपको पृष्ठभूमि में ब्लूटूथ का उपयोग करने की अनुमति देता है। ऐसा करने के लिए, आपको info.plist में इंगित करना होगा कि हम किस मोड में पेरिफेरल या सेंट्रल में उपयोग करना चाहते हैं।



अगला, प्रबंधक में, आपको पुनर्प्राप्ति कुंजी निर्दिष्ट करने और एक प्रतिनिधि विधि बनाने की आवश्यकता है। अब बैकग्राउंड मोड हमारे पास उपलब्ध है। यदि एप्लिकेशन सो जाता है या मेमोरी से अनलोड हो जाता है, तो जब आप वांछित पेरिफेरल पाते हैं या जब सेंट्रल कनेक्ट होता है, तो यह उठता है, और प्रबंधक आपकी कुंजी के साथ पुनर्स्थापित करता है।



सब कुछ ठीक है, रिलीज होने के लिए तैयार है। लेकिन यहां डिजाइनर हमारे पास दौड़ते हुए आते हैं और कहते हैं: "हम उपयोगकर्ताओं की तस्वीरें डालना चाहते हैं ताकि उनके लिए एक-दूसरे को ढूंढना आसान हो।" क्या करें? हमारी विशेषता में, आप केवल कुछ 500 बाइट्स लिख सकते हैं, लेकिन सामान्य 20 में कुछ उपकरणों पर :(



गहरा जाओ


इस समस्या को हल करने के लिए, हमें गहराई में जाना होगा।



अब हमने गैट / एटीटी स्तर पर उपकरणों से बात की। लेकिन iOS 11 में, हमारे पास L2CAP प्रोटोकॉल तक पहुंच है। हालांकि, इस मामले में, आपको स्वयं डेटा ट्रांसफर का ध्यान रखना होगा। पैकेट 2 Kb MTU के साथ भेजे जाते हैं, फिर से कुछ भी एनकोड करने की आवश्यकता नहीं है, नियमित रूप से एनएसएसट्रीम लागू किया जाता है। Apple के अनुसार डेटा दरें 394 Kbps तक हैं।

मान लीजिए कि आप सामान्य विशेषताओं के रूप में अपनी सेवा के किसी भी डेटा को पेरिफेरल से सेंट्रल में ट्रांसफर करते हैं। और मुझे चैनल खोलने में लग गया। आप इसे पेरिफेरल पर खोलते हैं, बदले में आप पीएसएम प्राप्त करते हैं - यह उस चैनल की संख्या है जिसे आप कनेक्ट कर सकते हैं और आपको उसी विशेषताओं का उपयोग करके इसे केंद्रीय में स्थानांतरित करना होगा। संख्या गतिशील है, सिस्टम स्वयं चुनता है कि किस पीएसएम को फिलहाल खोलना है। स्थानांतरण के बाद, आप पहले से ही सेंट्रल पर पेरिफेरल से कनेक्ट कर सकते हैं और आपके लिए सुविधाजनक प्रारूप में डेटा का आदान-प्रदान कर सकते हैं। आइए देखें कि यह कैसे करना है।

सबसे पहले, पेरिफेरल पर एन्क्रिप्टेड पोर्ट खोलें। आप इसे एन्क्रिप्शन के बिना कर सकते हैं, फिर इससे ट्रांसफ़र में थोड़ी तेज़ी आएगी।



अगला, प्रतिनिधि विधि में, हम पीएसएम प्राप्त करते हैं और इसे किसी अन्य डिवाइस पर भेजते हैं।



दूसरे उपकरण को जोड़ने के बाद, हमें एक विधि कहा जाएगा जिसमें हम चैनल से प्रसारण के लिए आवश्यक एनएसएसट्रीम प्राप्त कर सकते हैं।



सेंट्रल और भी आसान है, हम सिर्फ वांछित संख्या के साथ चैनल से कनेक्ट करते हैं ...



... और उसके बाद हमें वे धाराएँ मिलें जिनकी हमें आवश्यकता है। उनमें आप किसी भी आकार के किसी भी डेटा को स्थानांतरित कर सकते हैं, और L2CAP के शीर्ष पर अपने प्रोटोकॉल का निर्माण कर सकते हैं। इसलिए हमें प्राप्तकर्ता तस्वीरों के हस्तांतरण का एहसास हुआ।



लेकिन वहाँ नुकसान हैं, जहां उनके बिना करते हैं।

नुकसान


आइए पृष्ठभूमि में काम करते समय नुकसान को देखें। चूंकि पेरिफेरल और सेंट्रल की भूमिकाएं आपके लिए उपलब्ध हैं, आप सोच सकते हैं। कि पृष्ठभूमि में आप यह निर्धारित कर सकते हैं कि कौन से उपकरण पृष्ठभूमि में पास हैं और कौन से सक्रिय हैं। सिद्धांत रूप में, यह होना चाहिए था, लेकिन ऐप्पल ने एक प्रतिबंध लगाया: जो फोन पृष्ठभूमि में हैं, चाहे केंद्रीय या परिधीय, अन्य फोन जो पृष्ठभूमि में भी हैं के लिए उपलब्ध नहीं हैं। इसके अलावा, जो फोन बैकग्राउंड में हैं, वे गैर-आईओएस डिवाइस से दिखाई नहीं देते हैं। आइए देखें कि ऐसा क्यों होता है।

जब आपका डिवाइस सक्रिय होता है, तो यह एक नियमित प्रसारण पैकेट भेजता है, जिसमें डिवाइस का नाम और सेवाओं की सूची हो सकती है। यह उपकरण प्रदान करता है। और ओवरफ्लो डेटा वह सब है जो फिट नहीं था।



जब डिवाइस बैकग्राउंड में जाती है, तो यह नाम को प्रसारित नहीं करती है, और डेटा को ओवरफ्लो करने के लिए समर्थित सेवाओं की सूची को स्थानांतरित करती है। यदि एप्लिकेशन सक्रिय है, तो iOS डिवाइस से स्कैन करते समय, यह इस डेटा को पढ़ता है, और पृष्ठभूमि पर स्विच करते समय, यह इसे अनदेखा करता है। इसलिए, जब पृष्ठभूमि पर स्विच करते हैं, तो आप उन अनुप्रयोगों को नहीं देख पाएंगे जो पृष्ठभूमि में भी हैं।अन्य Apple ऑपरेटिंग सिस्टम हमेशा ओवरफ्लो डेटा को अनदेखा करते हैं, इसलिए यदि आप ऐसे उपकरणों की तलाश करते हैं जो आपकी सेवा का समर्थन करते हैं, तो आपको एक खाली सरणी मिलेगी। और यदि आप प्रत्येक डिवाइस से कनेक्ट होते हैं जो पास है और समर्थित सेवाओं का अनुरोध करता है, तो सूची में आपकी सेवा हो सकती है, और आप इसके साथ काम कर सकते हैं।



तब हम परीक्षण के लिए प्रस्तुत करने के लिए तैयार हो रहे थे, मामूली कीड़े को ठीक कर रहे थे, और अनुकूलन में लगे हुए थे। और अचानक, कुछ बिंदु पर, हम कंसोल में यह त्रुटि प्राप्त करने लगे:

CoreBluetooth[WARNING] Unknown error: 124 

सबसे बुरी बात यह थी कि किसी भी प्रतिनिधि पद्धति को नहीं बुलाया गया था, हम उपयोगकर्ता के लिए इस त्रुटि को भी नहीं हरा सकते थे। लॉग में बस एक संदेश - और चुप्पी, सब कुछ जम गया। कोई बड़ा बदलाव नहीं किया गया था, इसलिए हमने कमिट पर वापस आना शुरू कर दिया। और उन्होंने पाया कि उन्होंने एक बार कोड को ऑप्टिमाइज़ किया था और डेटा लिखने का तरीका बदल दिया था। समस्या यह थी कि सभी क्लाइंट अपडेट नहीं थे, इसलिए यह त्रुटि हुई।

 .write != .writeWithoutResponse 

हम खुश हैं कि हमने सबकुछ ठीक कर लिया, बल्कि इसे परीक्षण के लिए पास करने के लिए दौड़ा, और वे लगभग तुरंत हमारे पास लौट आए: “आपकी फैशन तस्वीरें काम नहीं करती हैं। वे सभी कम भार में आते हैं। ” हमने प्रयास करना शुरू किया, और यह सच है कि कभी-कभी, विभिन्न उपकरणों पर, टूटी हुई तस्वीरें अलग-अलग समय पर आती हैं। वे एक कारण तलाशने लगे।

और फिर उन्होंने पिछली त्रुटि देखी। तुरंत सोचा कि यह विभिन्न संस्करणों में था। लेकिन सभी परीक्षण उपकरणों से पुराने संस्करण को पूरी तरह से हटाने के बाद, त्रुटि अभी भी पुन: उत्पन्न हुई। हम दुखी थे ...

 CoreBluetooth[WARNING] Unknown error: 722 CoreBluetooth[WARNING] Unknown error: 249 CoreBluetooth[WARNING] Unknown error: 312 

हमने डिबगिंग टूल की तलाश शुरू कर दी। पहली बात जो हम सामने आए वो थी Apple ब्लूटूथ एक्सप्लोरर। एक शक्तिशाली कार्यक्रम, यह बहुत सारी चीजें कर सकता है, लेकिन ब्लूटूथ ले प्रोटोकॉल को डीबग करने के लिए, उपकरणों की खोज और विशेषताओं को प्राप्त करने के साथ एक छोटा टैब है। और हमें L2CAP का विश्लेषण करने की आवश्यकता है।

तब उन्हें लाइटब्लू एक्सप्लोरर मिला। यह एक बहुत ही सभ्य कार्यक्रम निकला, हालांकि iOS 7 से एक डिजाइन के साथ। यह ब्लूटूथ एक्सप्लोरर के रूप में एक ही काम कर सकता है, और यह भी जानता है कि विनिर्देशों के लिए कैसे सदस्यता लें। और यह अधिक स्थिर काम करता है। सब कुछ ठीक है, लेकिन फिर से L2CAP के बिना।

और फिर हमने सुप्रसिद्ध वायरशार्क स्निफर को याद किया।

यह पता चला कि वह ब्लूटूथ ले से परिचित था: वह L2CAP पढ़ सकता है, लेकिन केवल विंडोज के तहत। हालाँकि यह डरावना नहीं है कि हमें विंडोज या कुछ और नहीं मिला। सबसे बड़ा ऋण - कार्यक्रम केवल एक विशिष्ट उपकरण के साथ काम करता है। यही है, आपको आधिकारिक स्टोर में कहीं डिवाइस ढूंढना था। और आप खुद समझते हैं कि पिस्सू बाजार में एक बड़ी कंपनी को एक समझ से बाहर डिवाइस खरीदने की मंजूरी देने की संभावना नहीं है। हमने विदेशी ऑनलाइन स्टोर ब्राउज़ करना भी शुरू कर दिया है।

लेकिन यहां उन्हें अतिरिक्त Xcode टूल में PacketLogger प्रोग्राम मिला। यह आपको ओएस एक्स डिवाइस पर जाने वाले ट्रैफ़िक को देखने की अनुमति देता है। ओएस एक्स के तहत हमारे मनीड्रॉप को फिर से क्यों नहीं लिखा जाए? हमारे पास पहले से ही एक अलग पुस्तकालय था। हमने बस UIImage को NSImage से बदल दिया, सब कुछ 10 मिनट के बाद शुरू हुआ।



अंत में, हम उपकरणों के बीच बदले गए पैकेट को पढ़ सकते हैं। यह तुरंत स्पष्ट हो गया कि L2CAP के माध्यम से डेटा ट्रांसमिशन के समय एक विशेषता दर्ज की गई थी। और इस तथ्य के कारण कि फ़ोटो के हस्तांतरण के साथ चैनल पूरी तरह से कब्जा कर लिया गया था, आईओएस ने रिकॉर्डिंग को अनदेखा कर दिया, और उपेक्षा के बाद प्रेषक ने चैनल को तोड़ दिया। फिक्सिंग के बाद फोटो के ट्रांसफर में दिक्कत नहीं हुई।



यह सब, पढ़ने के लिए धन्यवाद :)

उपयोगी लिंक


WWDC / CoreBluaxy:


ब्लूटूथ


यूट्यूब

  • एरो इलेक्ट्रॉनिक्स → ब्लूटूथ लो एनर्जी सीरीज

Source: https://habr.com/ru/post/hi452278/


All Articles