Android 4.3 ब्लूटूथ कम ऊर्जा अस्थिर


189

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

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

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

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


संपादित करें:
लॉग डंप: इन लॉग के लिए मैंने अपना फ़ोन रूट किया और संबंधित आइटमों के ट्रेस स्तरों को /etc/bluaxy/bt_stack.conf में ले लिया।

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

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

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


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


जब तक आप समस्या का सामना नहीं कर रहे हैं तब तक अपने फोन के पूर्ण लॉग को बूट-अप से पोस्ट करें।
AAnkit

3
मैं सैमसंग गैलेक्सी एस 4 का उपयोग कर रहा हूं जो लीक हुए Google संस्करण एंड्रॉइड 4.3 स्थापित है; कनेक्ट / डिस्कनेक्ट करने के कई समय के बाद, जब मुझे सेवाओं का पता चलता है, तो मैं यादृच्छिक रूप से 129 (GATT_INTERNAL_ERROR) प्राप्त करूँगा और स्थिति 133 (GATT_ERROR, राज्य = BluetoothProfile.DEVICE_DISCONNECTED) के साथ onConnectionStateChange प्राप्त करूंगा।
Rets

1
एक या दो बार के लिए मुझे कुछ ही समय में 129 और 133 कॉलबैक की एकाधिक स्थिति मिली और मैं ब्लूटूथगैट कॉलबैक में कभी भी कोई कॉलबैक प्राप्त नहीं कर सका जब तक कि मैं अपने डिवाइस को रिबूट नहीं करता (लेकिन स्कैनिंग ठीक है)।
10

1
यह कहना न भूलें कि मैं TI चिप्स का उपयोग करके लगभग दस उपकरणों के साथ परीक्षण कर रहा हूं (क्षमा करें, मैं उनके मॉडल नहीं जानता) और नॉर्डिक चिप्स के साथ एक उपकरण। नॉर्डिक चिप्स के साथ डिवाइस त्रुटि की रिपोर्ट कभी नहीं (नहीं पर्याप्त समस्या साबित करने के लिए टीआई विशिष्ट है, हालांकि)।
Rets

1
मैं पुष्टि कर सकता हूं कि यह मुद्दा अभी भी सैमसंग गैलेक्सी S5 (दोनों G900VVRU2BOG5 और G900VVRU2BOA8 बिल्ड संस्करण) पर मौजूद है। अगर मैं सेटिंग्स> एप्लिकेशन मैनेजर >> ऑल >> ब्लूटूथ से डेटा क्लियर करता हूं , तो यह कुछ समय के लिए काम करता है।
आयरनब्लॉसम

जवाबों:


184

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

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

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

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

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

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

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

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

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

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

33
Google, अब आपको इसे ठीक करना है। चारों ओर यह काम (मैंने इसे प्लस किया क्योंकि यह काम करता है) हास्यास्पद है।
क्रिस हर्बर्ट

4
कभी-कभी, सेवा खोज एक स्थिति 0 (कोई समस्या नहीं मानने) के साथ सफल होगी, फिर भी विशेषता पढ़ता है NULL मान प्राप्त करेगा क्योंकि यह अनिवार्य रूप से जुड़ा हुआ नहीं है या विशेषताओं की खोज नहीं की गई थी (मैं इसे लॉग में देखता हूं: 11-01 18:37: 32.131: WARN / BluetoothGatt (20119): अनहेल्दी अपवाद: java.lang.NullPointerException)
लो-टैन

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

2
मेरा अनुभव है: सैमसंग एस 3 (4.3) ऊपर के पैरा 2 में वर्णित के रूप में एक गट क्लाइंट को बंद करने के बाद सफलतापूर्वक फिर से मिला; Nexus 4 और 7 (4.4.2) का उपयोग कर मैं कनेक्शन को गिराए जाने के बाद भी कनेक्ट नहीं कर सका, यहां तक ​​कि BL एडाप्टर को पुनरारंभ करने से, लेकिन इसे 2 मिनट बाद स्वचालित रूप से फिर से
जोड़ा

1
क्या कोई भी पुष्टि कर सकता है कि android.bluaxy.BluaxyGatt केवल एक लंबित GATT ऑपरेशन प्रति डिवाइस , प्रति प्रक्रिया या PERIOD (यानी: सभी प्रक्रियाओं में) को संभाल सकता है । मुझे लगता है कि यह प्रति DEVICE है, लेकिन यह समस्या इतनी विकराल है कि अगर यह अन्यथा होती तो मुझे आश्चर्य नहीं होता। यदि सीमा केवल प्रति डिवाइस है, तो ओएस / डिवाइस एक साथ कई ऑपरेशनों को संभालने में सक्षम है, जो बंदूक प्रूफ है कि यह समस्या पूरी तरह से ब्लूटूथएडेप्टर उदाहरण में कुछ कमजोर अनुभवहीन कार्यान्वयन के कारण है कि ओएस प्रत्येक प्रक्रिया को हाथ लगाता है (जो मुझे पता चला था) सभी प्रक्रियाओं में एक सिंगलटन)।
स्वोबी

18

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

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

समस्या

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

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

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

हालाँकि BLE की WIFI के साथ स्कैनिंग काफी स्थिर लग रही थी:

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

मेरा काम-काज

मैं के लिए ble स्कैन समय की एक छोटी अवधि में 3-4 सेकंड तो मैं 3-4 सेकंड के लिए बंद स्कैन बारी । तो फिर से।

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

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

1
आपका क्या मतलब है "बारी अनुकूलक बंद और फिर चालू"?
मैरियन पाडज़िओच

मैं मानता हूं, Wifi और ब्लूटूथ मिलकर Moto G.
Nigilan

@ MarianPa Mardzioch, "टर्न अडॉप्टर ऑफ़ और उसके बाद" @ बेंका का अर्थ है ब्लूटूथ एडेप्टर
अनूप

9

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

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

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

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

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


मैं किसी भी प्रकार के मैनुअल पेयरिंग या रिबूट के बिना CC2541 डिवाइस को लगातार कनेक्ट और पुनः कनेक्ट कर रहा हूं।
dgel

मेरी राय के लिए, कोई युग्मन आवश्यक नहीं है। आधिकारिक डॉक्स जोड़ी बनाने पर भी टिप्पणी नहीं करते हैं। मैं किसी भी युग्म के बिना लेखन, पठन, विशेषता परिवर्तित अधिसूचना भी कर सकता था। हालांकि, बस थोड़े समय के लिए। अब यह फिर से अस्थिर है ... सैमसंग BLE SKD v2.0 को भी जोड़ी बनाने की आवश्यकता नहीं थी और काफी अच्छा काम किया।
OneWorld

3
मैं पुष्टि कर सकता हूं, यह वाईफ़ाई बंद करने के बाद अधिक स्थिर है। हर किसी को यह कोशिश करनी चाहिए।
वनवर्ल्ड

1
युग्मन की आवश्यकता है या नहीं, डिवाइस कार्यान्वयन पर निर्भर है। nrf8002 डिवाइस को युग्मन की आवश्यकता होती है और सैमसंग 2.0 और 1.2 एपीआई दोनों ने इसका समर्थन किया। ऐसा लगता है जैसे आधिकारिक एपीआई समर्थन को युग्मन पहलू के साथ समस्या हो रही है जैसे कि मैं एक डिवाइस को खराब करने के बाद इसे खोलना असंभव लगता है!
क्रिस हर्बर्ट

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

7

कुछ मॉडलों में एक दोष है: https://code.google.com/p/android/issues/detail?id=180440

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

btGatt.disconnect();
btGatt.close();

क्यों closeजरूरी है?
इगोरगानापोलस्की

3
जब आप ब्लूटूथ को कई बार कनेक्ट करना चाहते हैं तो सही क्लोजिंग प्रक्रिया महत्वपूर्ण है। मेरे अनुभव में यह सबसे अच्छा काम करता है यदि आप एक अलग UNBOUND सेवा में अपना Ble कनेक्शन चलाते हैं ताकि आप इसे हाथ से शुरू और बंद कर सकें। और जिसे आप mConnectedGatt.disconnect () कहते हैं; ble_device = बातिल; अपने inDestroy () में। मेरे मामले में यह पैटर्न एक समस्या के बिना स्थिर काम करता है।
मेडटेक

4

मैं इसी तरह के मुद्दे का सामना कर रहा था। मेरा फिक्स था

if (Build.VERSION.SDK_INT >= 23) {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
}

& कॉल डिस्कनेक्ट करने के बाद बंद करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.