android - एंड्रॉइड 4.3 ब्लूटूथ कम ऊर्जा अस्थिर




bluetooth bluetooth-lowenergy (3)

मैं वर्तमान में एक ऐसा एप्लीकेशन विकसित कर रहा हूं जो ब्लूटूथ लो एनर्जी (नेक्सस 4 पर परीक्षण) का उपयोग करेगा। एंड्रॉइड 4.3 में आधिकारिक बीएलई एपीआई के साथ शुरू करने के बाद, मैंने देखा है कि जब मैं पहली बार डिवाइस को कनेक्ट करता हूं तो मैं शायद ही कभी उस डिवाइस या किसी अन्य डिवाइस से सफलतापूर्वक कनेक्ट / संवाद करने में सक्षम हूं।

here मार्गदर्शिका के बाद, मैं किसी डिवाइस से सफलतापूर्वक कनेक्ट कर सकता हूं, सेवाओं और विशेषताओं को स्कैन कर सकता हूं, और बिना किसी समस्या के नोटिफिकेशन पढ़ / लिख / प्राप्त कर सकता हूं। हालांकि, डिस्कनेक्ट करने और पुनः कनेक्ट करने के बाद, मैं अक्सर सेवाओं / विशेषताओं को स्कैन करने या पढ़ने / लिखने में असमर्थ होने में असमर्थ हूं। यह इंगित करने के लिए लॉग में कुछ भी नहीं मिला है कि यह क्यों हो रहा है।

एक बार ऐसा होने पर मुझे एप्लिकेशन को अनइंस्टॉल करना होगा, ब्लूटूथ अक्षम करना होगा, और फिर से काम करना शुरू करने से पहले फोन को पुनरारंभ करना होगा।

जब भी कोई डिवाइस डिस्कनेक्ट हो जाता है तो मैं ब्लूटूथगैट ऑब्जेक्ट पर क्लोज़ () को कॉल करना सुनिश्चित करता हूं और इसे शून्य पर सेट करता हूं। कोई अंतर्दृष्टि?

संपादित करें:
लॉग डंप: इन लॉगों के लिए मैंने अपने फोन को रूट किया और /etc/bluetooth/bt_stack.conf में संबंधित वस्तुओं के ट्रेस स्तर को ऊपर उठाया

सफल कनेक्शन - फोन को रिबूट करने और ऐप इंस्टॉल करने के बाद पहला प्रयास। मैं कनेक्ट करने में सक्षम हूं, सभी सेवाओं / विशेषताओं को खोजता हूं, और पढ़ता / लिखता हूं।

विफल प्रयास 1 - ऊपर दिए गए सफल कनेक्शन से डिस्कनेक्ट करने के बाद यह अगला प्रयास है। ऐसा लगता है कि मैं विशेषताओं को खोजने में सक्षम था, लेकिन पढ़ने का पहला प्रयास एक शून्य मूल्य लौटा और इसके तुरंत बाद डिस्कनेक्ट हो गया।

विफल प्रयास 2 - एक उदाहरण जहां मैं सेवाओं / विशेषताओं को खोजने में भी सक्षम नहीं हूं।

संपादित करें 2:
जिस डिवाइस को मैं कनेक्ट करने का प्रयास कर रहा हूं वह टीआई की सीसी 2541 चिप पर आधारित है। मैंने टीआई सेंसरटैग ( सीसी 2541 पर भी आधारित) प्राप्त किया और साथ ही पता चला कि टीआई ने कल सेंसरटाग के लिए एंड्रॉइड ऐप जारी किया था। हालांकि, इस ऐप में एक ही समस्या है। मैंने दो अन्य नेक्सस 4 एस पर एक ही परिणाम के साथ इसका परीक्षण किया: सेंसरटैग से कनेक्शन पहली या दूसरी बार सफल रहा है, लेकिन (लॉग के अनुसार) इसके बाद सेवाओं को खोजने में विफल रहता है, जिससे सभी प्रकार के दुर्घटनाएं होती हैं। मुझे आश्चर्य है कि यह इस विशिष्ट चिप के साथ कोई मुद्दा है या नहीं?


महत्वपूर्ण कार्यान्वयन संकेत

(शायद एंड्रॉइड ओएस अपडेट के कारण उन संकेतों में से कुछ जरूरी नहीं हैं।)

  1. एंड्रॉइड 4.3 के साथ नेक्सस 4 जैसे कुछ डिवाइस मौजूदा गैट इंस्टेंस का उपयोग करके कनेक्ट करने के लिए 45+ सेकंड लेते हैं । चारों ओर काम करें: डिस्कनेक्ट पर हमेशा गैट इंस्टेंस बंद करें और प्रत्येक कनेक्ट पर गैट का एक नया उदाहरण बनाएं।
  2. android.bluetooth.BluetoothGatt#close() करना न भूलें android.bluetooth.BluetoothGatt#close()
  3. onLeScan(..) अंदर एक नया धागा शुरू करें और फिर कनेक्ट करें। कारण: BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) हमेशा विफल रहता है, अगर LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) अंदर बुलाया जाता है LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) सैमसंग गैलेक्सी पर एक ही थ्रेड में Android 4.3 के साथ S3 (कम से कम JSS15J.I9300XXUGMK6 बनाने के लिए)
  4. अधिकांश डिवाइस विज्ञापन फ़िल्टर करते हैं
  5. कुछ सेवा UUID के लिए फ़िल्टर करने के लिए पैरामीटर के साथ android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) उपयोग न करें क्योंकि यह एंड्रॉइड 4.3 के साथ सैमसंग गैलेक्सी एस 3 में पूरी तरह टूट गया है और सामान्य रूप से 128 बिट यूयूआईडी के लिए काम नहीं करता है
  6. गैट हमेशा एक समय में एक कमांड को संसाधित कर सकता है । यदि कई आदेशों को दूसरे के बाद छोटा कहा जाता है, तो पहले व्यक्ति को गैट कार्यान्वयन की तुल्यकालिक प्रकृति के कारण रद्द कर दिया जाता है।
  7. मैं अक्सर एंड्रॉइड 5 के साथ आधुनिक उपकरणों पर भी देखता हूं, कि वाईफ़ाई ब्लूटूथ के साथ हस्तक्षेप करता है और इसके विपरीत। अंतिम उपाय के रूप में, ब्लूटूथ को स्थिर करने के लिए वाईफाई बंद करें।

शुरुआती के लिए ट्यूटोरियल

नए आने वालों के लिए एक सुंदर ओके एंट्री पॉइंट यह वीडियो ट्यूटोरियल हो सकता है: एंड्रॉइड के लिए ब्लूटूथ स्मार्ट एप्लीकेशन विकसित करना http://youtu.be/x1y4tEHDwk0

नीचे वर्णित समस्या और कार्य शायद ओएस अपडेट द्वारा तय किया गया है

चारों ओर काम करें: मैं अपने ऐप को "स्थिर" कर सकता हूं ...

  1. मैं उपयोगकर्ता को "ब्लूटूथ पुनरारंभ करें" सेटिंग प्रदान करता हूं। यदि वह सेटिंग सक्षम है, तो मैं कुछ बिंदुओं पर ब्लूटूथ को पुनरारंभ करता हूं जो इंगित करता है कि बीएलई स्टैक की शुरुआत अस्थिर हो रही है। उदाहरण के लिए अगर स्टार्ट झूठी वापसी करता है। यदि सेवा डिस्कवरी विफल हो जाती है तो एक अच्छा बिंदु भी हो सकता है। मैं सिर्फ ब्लूटूथ बंद और चालू करता हूं।
  2. मैं एक और सेटिंग "वाईफाई की बारी" प्रदान करता हूं। यदि वह सेटिंग सक्षम है, तो ऐप चल रहा है जब मेरा ऐप वाईफ़ाई बंद कर देता है (और बाद में इसे वापस चालू करता है)

यह काम चारों ओर अनुभवों पर आधारित है ...

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

वाईफ़ाई बंद करना:

मैं भी पुष्टि कर सकता हूं कि वाईफ़ाई ऑफ़लाइन को ब्लूटूथ 4.0 अधिक स्थिर बनाता है खासकर Google नेक्सस पर (मेरे पास नेक्सस 7 है)।

समस्या

यह है कि जिस अनुप्रयोग को मैं विकसित कर रहा हूं वह वाईफ़ाई और निरंतर ब्लूटूथ ली स्कैनिंग दोनों की आवश्यकता है । तो वाईफ़ाई बंद करना मेरे लिए कोई विकल्प नहीं था।

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

  • नेक्सस 7
  • मोटोरोला मोटो जी

हालांकि वाईफ़ाई के साथ बीएलई स्कैनिंग पर काफी स्थिर लग रहा था:

  • सैमसंग एस 4
  • एचटीसी वन

मेरा कामकाज

मैं 3-4 सेकेंड के थोड़े समय के लिए बीएलई स्कैन करता हूं, फिर मैं 3-4 सेकंड के लिए स्कैन ऑफ चालू करता हूं। फिर फिर से।

  • स्पष्ट रूप से जब मैं एक बीएलई डिवाइस से कनेक्ट कर रहा हूं तो मैं हमेशा बीएलई स्कैन ऑफ चालू करता हूं।
  • जब मैं किसी डिवाइस से डिस्कनेक्ट करता हूं तो मैं फिर से स्कैन शुरू करने से पहले स्टैक को रीसेट करने के लिए BLE (एडाप्टर बंद करें और फिर चालू) को पुनरारंभ करता हूं।
  • services या characteristics खोज करते समय भी मैं बीएलई को रीसेट करता हूं।
  • जब मुझे किसी डिवाइस से विज्ञापन डेटा प्राप्त होता है जिसे ऐप से कनेक्ट करना चाहिए (कनेक्ट करने में सक्षम होने के बिना 500 बार कहें - विज्ञापन के लगभग 5-10 सेकंड) मैं फिर से बीएलई रीसेट करता हूं।

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

मैं इस जवाब को दो दिनों में अपडेट कर दूंगा जब मैं सेवा खोज और गैट को रीबूट किए बिना अनुरोधों को पढ़ और लिखने का परीक्षण करता हूं।

संपादित करें: यह पता चला है कि मैं एक विकास फर्मवेयर संस्करण (हमारे सेंसर) पर परीक्षण कर रहा था जो जोड़े नहीं होने पर समस्याएं पैदा कर रहा था। हमारा नवीनतम उत्पादन फर्मवेयर निर्माण 2540 और 2541 के दशक में ठीक काम करता है।

संपादित करें: मैंने नोटिस किया है कि नेक्सस 7 2013 पर, वाईफ़ाई बंद होने पर कनेक्शन अधिक स्थिर होते हैं। मैं जानना चाहता हूं कि यह किसी और की मदद करता है या नहीं।

संपादित करें: मुझे लगता है कि यह युग्मन के साथ पीछे था। जोड़े जाने पर सब कुछ ठीक काम करता है। युग्मन के बाद, मैं ओपी के समान लक्षणों का अनुभव कर रहा हूं। यह अभी तक ज्ञात नहीं है अगर यह हमारे फर्मवेयर या एंड्रॉइड बीएलई एपीआई से संबंधित है। यदि परीक्षण हो तो सावधान रहें क्योंकि एक बार जोड़ा गया है, तो आप इस पोस्ट के 3 बी में बताए गए बग के कारण अनपेक्षित नहीं हो पाएंगे।





android-4.3-jelly-bean