Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रणाली >> Android

एंड्रॉइड ब्लूटूथ विश्वसनीयता को बढ़ावा दें:लगातार कनेक्टिविटी के लिए सिद्ध युक्तियाँ

एंड्रॉइड ब्लूटूथ विश्वसनीयता को बढ़ावा दें:लगातार कनेक्टिविटी के लिए सिद्ध युक्तियाँ <पी> आपके साथ ऐसा पहले भी हुआ होगा:आपके वायरलेस ईयरबड एक दिन पूरी तरह से कनेक्ट होते हैं, और अगले दिन वे ऐसा व्यवहार करते हैं जैसे वे कभी आपके फ़ोन से मिले ही नहीं। या आपकी स्मार्टवॉच दौड़ के बीच में ही गिर जाती है। जब ब्लूटूथ काम करता है तो अद्भुत होता है, लेकिन जब नहीं चलता तो परेशान करने वाला होता है।

<पी> मैं स्मार्ट-ग्लास जैसे पहनने योग्य उपकरणों पर एक ब्लूटूथ सॉफ्टवेयर इंजीनियर के रूप में काम करता हूं, और ये चीजें क्यों टूटती हैं, इसका पता लगाने में मैंने जितना समय बिताया है, उससे कहीं अधिक समय मैंने बिताया है।

<पी> इस लेख में, मैं आपको पर्दे के पीछे की एक झलक दिखाऊंगा:एंड्रॉइड का ब्लूटूथ स्टैक वास्तव में कैसे काम करता है, यह कभी-कभी अप्रत्याशित क्यों लगता है, और एक डेवलपर के रूप में आप अपने ऐप्स या सिस्टम को अधिक विश्वसनीय बनाने के लिए क्या कर सकते हैं।

सादी अंग्रेजी में ब्लूटूथ

<पी> इसके मूल में, ब्लूटूथ केवल दो उपकरणों के बीच की बातचीत है। लेकिन यह संचार की एक सरल रेखा नहीं है - यह एक दूसरे के ऊपर ढेर सारी परतें हैं।

  • <पी> रेडियो (नियंत्रक): वायु माध्यम पर वास्तविक सिग्नल भेजता और प्राप्त करता है।

  • <पी> सॉफ़्टवेयर मस्तिष्क (होस्ट स्टैक): यह तय करता है कि किससे और कैसे बात करनी है, साथ ही यह भी तय करता है कि वह चाहता है या नहीं।

  • <पी> प्रोफ़ाइल: बातचीत का उद्देश्य परिभाषित करें - जैसे संगीत स्ट्रीम करना या स्वास्थ्य डेटा सिंक करना।

  • <पी> प्रोटोकॉल: परिभाषित करें कि दूसरे डिवाइस से कैसे बात करनी है।

<पी> ब्लूटूथ के दो बड़े "फ्लेवर" हैं:

  • <पी> क्लासिक (बीआर/ईडीआर): हेडफ़ोन और कार किट जैसी चीज़ों के लिए उपयोग किया जाता है। अधिक वजन उठा सकते हैं.

  • <पी> कम ऊर्जा (एलई): फिटनेस बैंड, बीकन और अधिकांश पहनने योग्य वस्तुओं के लिए उपयोग किया जाता है। लंबे समय तक कायम रह सकता है.

<पी> अधिकांश आधुनिक गैजेट एक साथ दोनों का उपयोग करते हैं। यह शक्तिशाली है, लेकिन यह और भी चीजों के गलत होने का द्वार भी खोलता है।

एंड्रॉइड अपनी खुद की विचित्रताएं क्यों जोड़ता है

<पी> एंड्रॉइड ब्लूटूथ विश्वसनीयता को बढ़ावा दें:लगातार कनेक्टिविटी के लिए सिद्ध युक्तियाँ

<पी> एंड्रॉइड पर, ब्लूटूथ सिर्फ एक साफ-सुथरा पैकेज नहीं है। यह गतिशील भागों की एक श्रृंखला है:

  • <पी> आपका ऐप BluetoothAdapter पर कॉल करता है .

  • <पी> वेसिस्टम सेवाओंमें जाते हैं जैसे AdapterService .

  • <पी> फिर JNI के माध्यम से मूल कोड में (जावा नेटिव इंटरफ़ेस).

  • <पी> फिर चिप विक्रेता के ब्लूटूथ स्टैक में .

  • <पी> अंततः, यह रेडियो हार्डवेयर से टकराता है .

<पी> प्रत्येक फ़ोन निर्माता थोड़ा अलग ब्लूटूथ चिप और फ़र्मवेयर शिप करता है। इसका मतलब है कि बिल्कुल वही ब्लूटूथ ऐप सैमसंग, पिक्सेल या एंड्रॉइड पर चलने वाले किसी अन्य बजट फोन पर अलग तरह से व्यवहार कर सकता है।

"इट जस्ट डिसकनेक्टेड" के पीछे की वास्तविक समस्याएं

<पी> यहां कुछ सामान्य सिरदर्द हैं जिन्हें मैं देखता हूं, जिन्हें सरलता से समझाया गया है:

बॉन्डिंग समस्याएँ ("खोई हुई चाबियाँ" समस्या)

<पी> जब दो ब्लूटूथ डिवाइस जोड़ी बनाते हैं, तो वे एन्क्रिप्शन कुंजी (क्लासिक के लिए लिंक कुंजी, एलई के लिए लॉन्ग टर्म कुंजी) का आदान-प्रदान करते हैं और उन्हें गैर-वाष्पशील मेमोरी में संग्रहीत करते हैं। ये कुंजियाँ ही हैं जो उपकरणों को बाद में एक-दूसरे को पहचानने और उपयोगकर्ता से दोबारा पूछे बिना सुरक्षित रूप से पुनः कनेक्ट करने देती हैं।

<पी> "बेमेल मेमोरी" समस्या तब होती है जब एक डिवाइस की संग्रहीत कुंजियाँ दूसरे से मेल नहीं खातीं। इसका कारण यह हो सकता है:

  • <पी> एक फ़र्मवेयर अपडेट या OS अपग्रेड जो कुंजियों को मिटा देता है या पुन:उत्पन्न करता है।

  • <पी> फ़ैक्टरी रीसेट या "डिवाइस भूल जाओ" एक तरफ लेकिन दूसरी तरफ नहीं।

  • <पी> भंडारण खाली करने के लिए सिस्टम द्वारा कुंजियाँ दूषित या बेदखल की जा रही हैं।

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

समय बेमेल

<पी> ब्लूटूथ डिवाइस जब चाहें तब चैट नहीं करते हैं, वे एक कनेक्शन अंतराल पर सहमत होते हैं - अनिवार्य रूप से एक शेड्यूल जब प्रत्येक पक्ष "जागेगा" और पैकेट का आदान-प्रदान करेगा। इसे ऐसे समझें कि दो लोग एक कैफे में हर 30 मिनट में मिलने के लिए सहमत होते हैं।

<पी> बेमेल तब होता है जब:

  • <पी> दोनों पक्ष अलग-अलग अंतराल पर बातचीत करते हैं लेकिन पूरी तरह सहमत नहीं हैं (उदाहरण के लिए, एक सोचता है कि यह 30ms है, दूसरा 50ms)।

  • <पी> एक पक्ष का फ़र्मवेयर अद्यतन या कॉन्फ़िगरेशन परिवर्तन इसकी समय नीति को बदल देता है।

  • <पी> रेडियो स्थितियों के कारण एक पक्ष कई निर्धारित चेक-इन से चूक जाता है, जिससे घड़ियाँ अलग हो जाती हैं।

  • <पी> पावर-सेविंग लॉजिक (जैसे कोई फ़ोन डोज़ मोड में जा रहा हो) चुपचाप अंतराल को बढ़ा देता है।

<पी> यह बताता है कि क्यों कोई कनेक्शन पहले तो ठीक काम कर सकता है लेकिन बाद में विफल होने लगता है:डिवाइस शुरू में एक अंतराल पर समन्वयित होते हैं, लेकिन फिर एक पक्ष की नीति या व्यवहार बदल जाता है। उपयोगकर्ता के दृष्टिकोण से, यह ऑडियो हकलाना, धीमा इनपुट (गेम कंट्रोलर पर), या "यह पहले ठीक काम कर रहा था" के बाद यादृच्छिक डिस्कनेक्ट जैसा दिखता है।

अप्रत्याशित वियोग

<पी> जब एक ब्लूटूथ लिंक समाप्त होता है, तो रेडियो परत (नियंत्रक) और उच्च-स्तरीय ओएस स्टैक (होस्ट) को स्पष्ट संकेतों का आदान-प्रदान करना चाहिए। नियंत्रक एक HCI डिसकनेक्शन पूर्ण ईवेंट भेजता है (मूल रूप से:"अलविदा, हमारा काम हो गया" ). और फिर होस्ट को अपनी आंतरिक स्थिति को अपडेट करना चाहिए, GATT/ACL सत्र को साफ़ करना चाहिए, और पुन:कनेक्शन के लिए तैयार रहना चाहिए।

<पी> लेकिन व्यवहार में, यह हमेशा पंक्तिबद्ध नहीं होता:

  • <पी> कभी-कभी नियंत्रक सफाई से अलविदा कहता है, लेकिन होस्ट स्टैक अपनी स्थिति को ठीक से अपडेट नहीं करता है। ऐप अभी भी "सोचता है" कि कनेक्शन सक्रिय है, इसलिए पुनः कनेक्ट करने के प्रयास चुपचाप विफल हो जाते हैं।

  • <पी> कुछ प्लेटफ़ॉर्म आक्रामक रूप से कनेक्शन स्थिति को कैश करते हैं (विशेषकर iOS)। यदि ओएस मानता है कि कनेक्शन अभी भी वैध है, तो यह तब तक नए कनेक्शन का प्रयास शुरू नहीं करेगा जब तक आप ब्लूटूथ को टॉगल नहीं करते या रीबूट नहीं करते।

  • <पी> रेस की स्थिति तब उत्पन्न हो सकती है जब डिस्कनेक्शन की घटना तब होती है जब कोई अन्य ऑपरेशन (उदाहरण के लिए, सेवा खोज, बॉन्डिंग, या एन्क्रिप्शन सेटअप) उड़ान में हो। ओएस इस बात को लेकर भ्रमित हो सकता है कि डिवाइस वास्तव में किस स्थिति में है में.

  • <पी> कुछ उपकरणों पर, एक साफ डिस्कनेक्शन के बाद तेजी से पुनः कनेक्ट करने का प्रयास आंतरिक कूलडाउन टाइमर से टकराता है। नियंत्रक इसे अनदेखा कर देता है और ऐप को प्रतीक्षा में छोड़ देता है।

<पी> उपयोगकर्ता के दृष्टिकोण से, डिवाइस "अटक गया" दिखता है। पुनर्प्राप्त करने का एकमात्र तरीका ब्लूटूथ को टॉगल करना, ऐप को पुनरारंभ करना या एक्सेसरी को पावर साइकल करना है, भले ही तकनीकी रूप से कुछ भी "विफल" न हो।

डेवलपर्स कैसे बेहतर कर सकते हैं

<पी> यदि आप ब्लूटूथ ऐप बना रहे हैं, तो यहां कुछ आदतें दी गई हैं जो बहुत सारा दर्द बचाती हैं:

पहले बॉन्डेड डिवाइस की जांच करें

<पी> विफल कनेक्शन के सबसे आम कारणों में से एक बेमेल बॉन्डिंग जानकारी है:फ़ोन और एक्सेसरी अब समान एन्क्रिप्शन कुंजियाँ साझा नहीं करते हैं। भले ही डिवाइस यूआई में दिखाई दे, हो सकता है कि ओएस ने अपनी चाबियाँ खो दी हों।

<पी> कनेक्शन का प्रयास करने से पहले, हमेशा सिस्टम की बॉन्डेड डिवाइस सूची को BluetoothAdapter.getBondedDevices() से क्वेरी करें . उदाहरण के लिए:

if (adapter.getBondedDevices().contains(targetDevice)) {
 targetDevice.connectGatt(context, false, gattCallback);
} else {
 showToast("Please re-pair this device to restore the connection.");
}
<पी> यह सुनिश्चित करता है कि आप केवल उन डिवाइसों से सुरक्षित कनेक्ट का प्रयास करें जिन पर OS अभी भी भरोसा करता है। यदि लक्ष्य डिवाइस बंधी हुई सूची में नहीं है, तो आप उपयोगकर्ता को भ्रमित करने वाली कनेक्शन त्रुटियों के साथ छोड़ने के बजाय एक स्पष्ट निर्देश ("कृपया इस डिवाइस को फिर से जोड़ें") दे सकते हैं।

कॉलबैक को सावधानी से संभालें

<पी> एक और सूक्ष्म ख़तरा यह मान लेना है कि एक STATE_CONNECTED ईवेंट का मतलब है कि कनेक्शन सफल रहा। वास्तव में, onConnectionStateChange() अंतर्निहित ऑपरेशन विफल होने पर भी कनेक्टेड स्थिति की रिपोर्ट कर सकता है, वास्तविक परिणाम status में है तर्क. प्रेत कनेक्शनों का पीछा करने से बचने के लिए, हमेशा status दोनों की जांच करें और newState :

if (status == BluetoothGatt.GATT_SUCCESS &&
 newState == BluetoothProfile.STATE_CONNECTED) {
 gatt.discoverServices();
} else {
 gatt.close();
}
<पी> यह पैटर्न आपको किसी मृत कनेक्शन पर सेवा खोज का प्रयास करने से रोकता है और यह सुनिश्चित करता है कि पुराने सत्र तुरंत बंद हो जाएं, जिससे स्टैक पुनः प्रयास के लिए तैयार हो जाए।

असफलताओं की अपेक्षा करें

<पी> वास्तविक दुनिया में ब्लूटूथ कनेक्शन हर समय विफल रहते हैं - डिवाइस सीमा से बाहर चले जाते हैं, 2.4 गीगाहर्ट्ज बैंड में हस्तक्षेप बढ़ जाता है, या रेडियो बस व्यस्त रहता है। सबसे खराब चीज़ जो कोई ऐप कर सकता है वह है टाइट लूप में तुरंत पुनः प्रयास करना, जिससे बैटरी ख़त्म हो जाती है और स्टैक अस्थिर हो जाता है।

<पी> एक बेहतर तरीका इस तरह से घातीय बैकऑफ़ लागू करना है:

long delay = (long) Math.min(250 * Math.pow(2, attempt), 30000);
new Handler(Looper.getMainLooper()).postDelayed(connectAction, delay);
<पी> इसका मतलब है कि आपका पहला पुनर्प्रयास जल्दी (~250 एमएस) हो जाता है, लेकिन बाद का पुनर्प्रयास धीमा हो जाता है (500 एमएस, 1 सेकंड, 2 सेकंड...), एक उचित अधिकतम सीमा तक। बैकऑफ़ रेडियो या ओएस पर दबाव डाले बिना आपके ऐप को लचीला बनाता है।

सही टूल का उपयोग करें

<पी> हुड के नीचे क्या हो रहा है, इसकी दृश्यता के बिना, कनेक्शन समस्याएं यादृच्छिक लगती हैं। nRF कनेक्ट जैसे उपकरण आपको अपने डिवाइस के विरुद्ध इंटरैक्टिव रूप से स्कैन करने, कनेक्ट करने और GATT ऑपरेशन चलाने की सुविधा देता है, जबकि Android का ब्लूटूथ HCI स्नूप लॉग एक्सचेंज किए जा रहे वास्तविक पैकेटों का खुलासा करता है। उदाहरण के लिए:

Settings.Secure.putInt(context.getContentResolver(), "bluetooth_hci_log", 1);
<पी> एक बार सक्षम होने पर, आप लॉगकैट ट्रेस कैप्चर कर सकते हैं और पुष्टि कर सकते हैं कि विफलता गुम कुंजियों के कारण है (Insufficient Authentication ), समय बेमेल, या हस्तक्षेप। इन टूल का उपयोग करने से न केवल आपको अपने ऐप को डीबग करने में मदद मिलती है, बल्कि यह यह भी साबित होता है कि समस्या आपके कोड, ओएस या एक्सेसरी फ़र्मवेयर में है या नहीं।

<पी> एंड्रॉइड ब्लूटूथ विश्वसनीयता को बढ़ावा दें:लगातार कनेक्टिविटी के लिए सिद्ध युक्तियाँ

बड़े सबक

<पी> ब्लूटूथ के साथ काम करने से मुझे ऐसे सबक मिले जो सामान्य तौर पर इंजीनियरिंग पर लागू होते हैं:

  • <पी> वायरलेस कभी भी संपूर्ण नहीं होता, इसलिए हमेशा पुनर्प्राप्ति को ध्यान में रखकर निर्माण करें।

  • <पी> लॉग और मेट्रिक्स वैकल्पिक नहीं हैं. वे अराजकता के दौरान आपका नक्शा हैं।

  • <पी> अव्यवस्थित वास्तविक दुनिया में सबसे सरल समाधान आमतौर पर सबसे अच्छा रहता है।

निष्कर्ष

<पी> ब्लूटूथ गड़बड़ है क्योंकि यह हार्डवेयर, फ़र्मवेयर और सॉफ़्टवेयर की एक श्रृंखला है जो सभी सहयोग करने की कोशिश कर रहे हैं। एंड्रॉइड पर, चिप्स और विक्रेताओं की विविधता इसे और भी पेचीदा बना देती है।

<पी> लेकिन इसका मतलब यह नहीं है कि आप असहाय हैं। यह समझकर कि परतें कैसे काम करती हैं और अपने ऐप्स को पुनः प्रयास, जांच और उचित लॉगिंग के साथ डिज़ाइन करके, आप ब्लूटूथ को अपने उपयोगकर्ताओं के लिए बहुत कम "अजीब" महसूस करा सकते हैं।

<पी> अगली बार जब आपके ईयरबड खराब होंगे, तो आपको पता चल जाएगा - यह आप नहीं हैं। यह सिर्फ ब्लूटूथ ही ब्लूटूथ है।

<पी> ⚡ब्लूटूथ विकास पर मैं जो कई लेख लिखने जा रहा हूं उनमें से यह पहला लेख है। अगले में, हम एंड्रॉइड पर एक सुरक्षित ब्लूटूथ लो एनर्जी (BLE) GATT क्लाइंट और सर्वर बनाने के तरीके के बारे में गहराई से जानेंगे। बने रहें! <पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें


  1. हल किया गया:Windows 10 में सर्विस होस्ट स्थानीय सिस्टम उच्च CPU उपयोग हल किया गया:Windows 10 में सर्विस होस्ट स्थानीय सिस्टम उच्च CPU उपयोग

    क्या आपने विंडोज़ 10 लैपटॉप को बहुत धीमी गति से चलते हुए देखा, अनुत्तरदायी हो गया, हाल के विंडोज अपडेट के बाद प्रतिक्रिया नहीं दे रहा है और टास्क मैनेजर सर्विस होस्ट लोकल सिस्टम प्रक्रियाओं की जाँच कर रहा है जो बहुत अधिक सीपीयू, मेमोरी और डिस्क का उपभोग कर रहे हैं? आइए समझते हैं सेवा होस्ट प्रक्रिया

  1. विंडोज 11/10 पर WpnUserService.dll त्रुटि को कैसे ठीक करें? विंडोज 11/10 पर WpnUserService.dll त्रुटि को कैसे ठीक करें?

    WpnUserService.dll Windows Push Notification User Service से जुड़ी एक डायनामिक लिंक्ड लाइब्रेरी है। यह सुनिश्चित करता है कि विंडोज या किसी अन्य ऐप द्वारा भेजी गई कोई भी सूचना ठीक से काम करे। यदि सेवा विफल हो जाती है या डीएलएल भ्रष्ट हो जाता है, तो विंडोज उपयोगकर्ता सभी प्रकार की सूचनाओं से चूक जाएं

  1. Windows 10 या 7 को स्थापित करने के लिए UEFI बूट करने योग्य USB ड्राइव कैसे बनाएं? Windows 10 या 7 को स्थापित करने के लिए UEFI बूट करने योग्य USB ड्राइव कैसे बनाएं?

    यह एक यूईएफआई कंप्यूटर के लिए विंडोज 10 या विंडोज 7 इंस्टाल इमेज के साथ बूट करने योग्य यूएसबी फ्लैश ड्राइव बनाने के तरीके के बारे में एक चरण-दर-चरण मार्गदर्शिका है। हमें निम्नलिखित की आवश्यकता होगी: USB फ्लैश ड्राइव (USB v2 या v3) जिसकी क्षमता कम से कम 4 GB . है Windows 7 या 8 GB . के लिए विंडोज 10