2012-09-18 25 views
7

ठीक है यह सौदा है। मुझे ब्लूटूथ सक्षम दोनों के साथ दो गैलेक्सी नेक्सस फोन मिले।एंड्रॉइड ब्लूटूथ IOException: कनेक्शन से इनकार कर दिया

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

http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm से देखते हुए निम्न मानक UUIDs गैलेक्सी नेक्सस डिवाइस से संपर्क में हैं।

  • 0x1116 - NAP
  • 0x112f - PBAP (फोनबुक एक्सेस प्रोफ़ाइल)
  • 0x111f - HFP (हाथ मुक्त)
  • 0x1105 - OPP (ऑब्जेक्ट पुश प्रोफ़ाइल)
  • 0x1112 - HSP (हेडसेट प्रोफ़ाइल)
  • 0x110c - AVRCP
  • 0x110a - A2DP

मैं ओपीपी प्रोफाइल (UUID 00001105-0000-1000-8000-00805F9B34FB) के माध्यम से कनेक्ट करने की कोशिश कर रहा हूं और उपकरणों के बीच ऑब्जेक्ट्स (फाइलें) दबाता हूं। मैं पूरे Android API documentation को कैसे खोजूं, जोड़ी/बॉन्ड (थ्रेडिंग इत्यादि) को खोजने और सभी ब्लूटूथ कनेक्शन प्रबंधित करने के लिए चला गया है। मैंने एसपीपी (0x1101) प्रोफाइल के माध्यम से सफलतापूर्वक कनेक्ट और लीगेसी बोर्ड डिवाइस से बात करने में कामयाब रहा है।

हालांकि, जब मैं दो गैलेक्सी नेक्सस फोन के बीच socket.connect() का उपयोग करने का प्रयास करता हूं, तो युग्मन संवाद दिखाई देता है और मैं दोनों डिवाइसों पर Pair बटन क्लिक करता हूं। उसके बाद, मुझे तुरंत Connection Refused IOException मिलता है। ध्यान दें कि युग्मन के बाद एक बार फिर कभी नहीं पूछा जाता है जो सुरक्षित लिंक कैश किए जाने के बाद से समझ में आता है।

मैं इन मानक प्रोफाइल इन मानक UUIDs कारण है कि वे संपर्क में हैं का उपयोग कर कनेक्ट नहीं कर सकता है? मैं अपने ऐप से इन प्रोफाइल में से किसी से कैसे जुड़ सकता हूं और उनके साथ बातचीत कर सकता हूं? क्या ऐसा इसलिए है क्योंकि मेरा ऐप किसी तरह भरोसेमंद नहीं है? अजीब बात यह है कि एंड्रॉइड पर Share कार्यक्षमता भी काम नहीं करती है। क्या यह एंड्रॉइड पर पूरी तरह टूटा हुआ है?

मुझे "अच्छी तरह से ज्ञात UUID एसपीपी एक 0x1101" का उपयोग करने के डॉक्स की तरह कहते हैं कि संकेत दे रही है से बचें। यह वह नहीं है जिसकी मुझे चाहत है। मुझे यह अच्छी तरह से समझ है कि यह सामान कैसे काम करता है और मैं समस्या का वास्तविक समाधान या स्पष्टीकरण ढूंढ रहा हूं।

मैं ठेठ "प्रतिबिंब" समाधान को देखा है लेकिन मुझे समझ नहीं आता क्यों यह अभी भी एंड्रॉयड पर एक समस्या है? लोग इस काम को करने के लिए प्रतिबिंब का उपयोग क्यों करते हैं? क्या हम इसे ठीक करने के लिए एंड्रॉइड पर एक बग फाइल कर सकते हैं?

उन UUIDs मानक हैं, तो किसी भी अनुप्रयोग से कनेक्ट करने और उन लोगों के साथ बातचीत करने के लिए सक्षम होना चाहिए। यह एक मुद्दा क्यों है और मुझे यह अपवाद क्यों मिलता है?

अग्रिम धन्यवाद।

अद्यतन

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

+0

आपने सही अनुमतियां सेट की हैं? http://developer.android.com/guide/topics/connectivity/bluetooth.html#Permissions – Lars

+0

@ लार्स बेशक उसने किया। dnkoutso: आप सॉकेट को कितनी अच्छी तरह खोल रहे हैं? क्या आप फिर से जोड़ना चाहते हैं, वह है - फिर अनपेयर फिर से जोड़ी। बीटीडब्ल्यू, क्या यह 2 स्तर है? – nullpotent

+0

@iccthedral, 2 स्तर से आपका क्या मतलब है? मैं अक्सर दोनों डिवाइसों पर असली सेटिंग्स ऐप में जाता हूं और जोड़ी को हटा देता हूं। एक बार जब मैं 'socket.connect()' को फिर से कॉल करता हूं तो यह मुझे जोड़ों के संवाद और पासकी संख्या से भर देता है। दुर्भाग्यवश, मुझे "कनेक्शन अस्वीकार" IOException मिलने के ठीक बाद। – dnkoutso

उत्तर

2

क्या आपने एक गैर-मानक प्रोफ़ाइल का उपयोग करने का प्रयास किया है? यानी आपके ऐप के लिए कस्टम UUID। यह आपको यह जानने में भी मदद करेगा कि आपकी प्रोफ़ाइल (सबसे अधिक संभावना) केवल उसी ऐप से पंजीकृत किसी अन्य ऐप की बजाय अपने ऐप से कनेक्ट हो रही है।

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

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

जैसा कि टिप्पणियों में से एक भी पोस्ट किया गया है, मैं असफल होने के बाद फिर से कनेक्ट करने का प्रयास भी करूंगा।

मूल रूप से कोड लिखते हैं जो पहले प्रयास को विफल करने की योजना बनाते हैं, लेकिन फिर विफलता होने पर कोड 5 सेकंड में फिर से कनेक्ट करने का प्रयास करता है।

ये अपूर्ण समाधान हैं लेकिन एंड्रॉइड पर ब्लूटूथ कार्यान्वयन भी अपूर्ण है (आईएमएचओ)। आशा है कि मदद करता है

संपादित

सवाल अद्यतन और टिप्पणियों के आधार पर:

मैं कुछ इस बात से सहमत निश्चित रूप से त्रुटिपूर्ण है। समस्या का एक हिस्सा मुझे लगता है कि बीटी ड्राइवर अलग-अलग हैं और प्रत्येक के अलग-अलग quirks के साथ एक अलग बीटी ढेर है। मुझे एक प्रश्न भी मिला जो प्रतिबिंब विधि और कस्टम UUID, और अन्य मानक विधियों दोनों का उपयोग करता है। यह मेरे लिए चरम लगता है लेकिन यह सबसे अधिक जमीन को कवर करता है। दुर्भाग्यवश ऐप डेवलपर्स के रूप में हमारे पास निम्न स्तर के ढेर/कोड/ड्राइवरों पर कोई नियंत्रण नहीं है।

मुझे अपने दो ब्लूटूथ साझाकरण ऐप्स के साथ मिला है कि पहली जोड़ी हमेशा मुश्किल होती है

मुझे यह जानकर खुशी हो रही है कि यह सिर्फ मुझे नहीं है।

+1

मैंने अपने स्वयं के कस्टम यूयूआईडी के साथ कनेक्शन बनाने में कामयाब रहा है। मैं समझ में नहीं आता कि ये सार्वजनिक रूप से ब्लूटूथ मानक यूयूआईडी कैसे काम नहीं कर रहे हैं। वे एंड्रॉइड पर सामान्य सिस्टम "शेयरिंग" पर भी काम नहीं कर रहे हैं, यह भी एक संकेत है कि एंड्रॉइड कोड में कुछ खराब है। – dnkoutso

+0

मैं सहमत हूं कि कुछ निश्चित रूप से छोटी है। समस्या का एक हिस्सा मुझे लगता है कि बीटी ड्राइवर अलग-अलग हैं और प्रत्येक के अलग-अलग quirks के साथ एक अलग बीटी ढेर है। मुझे एक प्रश्न भी मिला जो प्रतिबिंब विधि और कस्टम, और अन्य मानक तरीकों दोनों का उपयोग करता है। यह मेरे लिए चरम लगता है लेकिन यह सबसे अधिक जमीन को कवर करता है। दुर्भाग्यवश ऐप डेवलपर्स के रूप में हमारे पास निम्न स्तर के ढेर/कोड/ड्राइवरों पर कोई नियंत्रण नहीं है। – pjco

4

मैं इस समस्या में भाग गया और मेरे लिए काम करने वाला एक समाधान ढूंढने में कामयाब रहा।

मेरे मामले में मैं तीन विभिन्न परीक्षण उपकरणों का उपयोग कर (नेक्सस 5, Galaxy S4, नोट 2) और किसी कारण से, नोट 2 मेरी ब्लूटूथ मॉड्यूल से कनेक्ट नहीं हैं अभी तक अन्य दो होगा।

तर्क मैं पाया है कि ब्लूटूथ ड्राइवरों अलग-अलग हो जाता है, और थोड़ा अलग कनेक्शन तरीकों विभिन्न उपकरणों के बीच एक कनेक्शन बनाने के लिए की जरूरत है।

तीन विधियों का उपयोग मैं 'सुरक्षित', 'असुरक्षित' और 'प्रतिबिंब विधि'/'hax' कहा जाता है।

  switch(connType) 
      { 
      case Secure: 
       tmpSocket = device.createRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Insecure: 
       tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Hax: 
       Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
       tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1)); 
       break; 
      } 

मेरे मामले में, सुरक्षित मोड दोनों नेक्सस 5 के लिए काम किया और Galaxy S4 लेकिन यह नोट 2.

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

मैंने इस मामले में भाग नहीं लिया है जहां इन तीन तरीकों में से एक काम नहीं किया है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^