मेरे पास एक प्रोजेक्ट है जो ब्लूटूथ पर किसी डिवाइस से कनेक्ट होता है। यह काफी भरोसेमंद काम करता था, लेकिन अब यह हर बार BluetoothSocket.connect()
कॉल विफल रहता है। (ठीक है, मुझे इसे 4 घंटे की अवधि में हजारों प्रयासों के दौरान एक बार कनेक्ट करने के लिए मिला।) अधिकांश कोड को BluetoothSocket
डिवाइस प्राप्त करने में सामान्य संशोधन के अपवाद के साथ, एपीआई में मानक नमूना चैट कोड से लिया गया है। खुद:BluetoothSocket.connect() फेंकना अपवाद "पढ़ा विफल"
Method m = device.getClass().getMethod(
"createRfcommSocket", new Class[] { int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
यहाँ ब्याज की विधि है, जो एक बार एक BluetoothSocket
चलाने हो जाता है प्राप्त किया जाता है है: (प्रिंट किए गए अपवाद जबकि connect()
बुला पकड़ा है)
public void run() {
setName("ConnectThread" + mSocketType);
// Always cancel discovery because it will slow down a connection
mAdapter.cancelDiscovery();
// Make a connection to the BluetoothSocket
try {
mmSocket.connect();
} catch (Exception e) {
Log.e(TAG, "Connection to " + mmDevice.getName() + " at "
+ mmDevice.getAddress() + " failed:" + e.getMessage());
// Close the socket
try {
mmSocket.close();
} catch (Exception e2) {
Log.e(TAG, "unable to close() " + mSocketType
+ " socket during connection failure", e2);
}
connectionFailed(e.getMessage());
return;
}
// Reset the ConnectThread because we're done
synchronized (BluetoothChatService.this) {
mConnectThread = null;
}
// Start the connected thread
connected(mmSocket, mmDevice, mSocketType);
}
प्रासंगिक लॉग प्रविष्टि यह है:
11-30 10: 23: 51.685: ई/ब्लूटूथकैट सेवा (2870): पर कनेक्शन ZYNO-700091 00: 06: 66: 42: 8E: 01 विफल: पढ़ा गया असफल, सॉकेट बंद हो गया, पढ़ना जारी रखें: -1
यह त्रुटि थोड़ी देर में आने वाली थी। मेरे पास एक आक्रामक रीकनेक्ट सिस्टम है - यह मूल रूप से कनेक्ट होने तक कनेक्शन को ऊपर और ऊपर हथियार देता है, और यदि यह डिस्कनेक्ट हो जाता है, तो यह फिर से इसे शुरू कर देता है। तो, यह कनेक्शन थ्रेड को मारता है और लगातार खरोंच से शुरू होता है। मैंने सोचा था कि वहां कोई समस्या हो सकती है - हो सकता है कि एक मल्टीथ्रेडिंग वाला हो या शायद सॉकेट क्लीनअप/प्रारंभिक प्रबंधन को संभालने में। हालांकि, अगर ऐसा होता है, तो भी मैं पहले कनेक्शन प्रयास को सफल होने की उम्मीद करता हूं, क्योंकि उस सिस्टम में असफल कनेक्शन प्रयास होने तक तब तक नहीं चलता है।
मैं source code में देखा अपवाद फेंक। मुद्दा यह प्रतीत होता है कि अंतर्निहित InputStream
में कोई डेटा नहीं है। बेशक, यह वास्तव में एक जवाब नहीं है, बस इसके प्रति एक कदम है। स्ट्रीम में कोई डेटा क्यों नहीं होगा?
मैं संभावित मुद्दे के बारे में खुले दिमाग रखने की कोशिश कर रहा हूं। क्या मुझे BluetoothSocket
ठीक से मिल रहा है? तथ्य यह है कि यह एक बार एक अंतःविषय मुद्दा था और अब लगभग स्थिर है मुझे मल्टीथ्रेडिंग पर संदेह है, लेकिन यह सी ++ की तुलना में जावा में अपेक्षाकृत सरल विषय है - यदि आप जानते हैं कि आप क्या कर रहे हैं तो इसे खराब करना मुश्किल है। इसके अलावा, इस कोड का अधिकांश हिस्सा (विशेष रूप से, धागे को सिंक्रनाइज़ करने से संबंधित भागों) सीधे नमूना कोड से बाहर है।
दूसरे छोर पर डिवाइस एक एम्बेडेड ब्लूटूथ डिवाइस है, इसलिए वहाँ उस छोर से समस्या को दूर करने की उम्मीद नहीं है।
अद्यतन ===========================
यह मेरे लिए हुआ है कि यह (एक OS अपग्रेड के कारण हो सकता है मैं गैलेक्सी नेक्सस फोन पर चल रहा हूं - मेरे पास परीक्षण करने के लिए कई हैं)। इसलिए मैंने 4.0.4 के साथ एक नया फोन अनपॅक किया और यह काम किया! तो फिर वापस चला गया और दो मूल परीक्षण फोनों पर परीक्षण किया, दोनों 4.2 रन बना रहे थे, इस विफलता की उम्मीद है कि मैं इस बार देख रहा हूं। आश्चर्यजनक रूप से, अब यह उन फोन पर भी काम करता है। मैं कहना चाहता हूं कि मैंने यह काम फिर से करने के लिए कुछ किया है, लेकिन मैंने नहीं किया। मैं अभी भी रहस्यमय हूं, और अब भी संदिग्ध है कि जब मैं वास्तव में इसकी आवश्यकता होती हूं तो यह काम काम करने जा रहा है।
मुझे आश्चर्य है कि यदि ऐसी कोई संभावना है कि किसी तरह 4.0.4 का उपयोग कर ठीक से सर्वर मॉड्यूल के राज्य सेट कर सकते हैं जोड़ने के लिए, 4.2 उपकरणों के लिए यह ग्रहणशील बनाने? अंधेरे में बस एक शॉट, मुझे लगता है ...
अद्यतन 2 ===========================
मैंने पाया कि अयुग्मित हो और फिर से जोड़ी की अनुमति देगा कनेक्ट करने के लिए उपकरण। यह एक कामकाज है, लेकिन यह कुछ भी नहीं है।
मैं एक ही मुद्दा है, मैं एक Datamax ओ'नील APEX4 प्रिंटर पर प्रिंट के माध्यम से ब्लूटूथ के लिए एक कोड है। हनीकॉम्ब 3.2 के साथ एक गैलेक्सी टैब 7 प्लस पर ठीक काम करता है। लेकिन आईसीएस या उच्चतर वाले अन्य उपकरणों में काम नहीं करते हैं। मैं ब्लूटूथ सॉकेट ऑब्जेक्ट की तुलना कर रहा हूं और बहुत अलग हैं। क्या आप वाकई कोई कोड नहीं जोड़ा है? – ClarkXP
जेलीबीन का एक पूरी तरह से अलग ब्लूटूथ स्टैक है, इसलिए संस्करण अंतर निश्चित रूप से कुछ ट्रिगर कर सकता है, लेकिन यह स्वयं ही यह नहीं समझाएगा कि यह पुराने डिवाइस से कनेक्ट होने के बाद काम क्यों कर रहा है या काम नहीं कर रहा है। क्या यह युग्मन के साथ किया जा सकता है? यदि यह फिर से होता है, तो डिवाइस से अनपेक्षित करने का प्रयास करें और फिर से जुड़ें, और देखें कि क्या होता है। –
@DanHulme मुझे लगता है कि आप सही हैं, यह अलग ब्लूटूथ स्टैक है जो इसका कारण बन रहा है। मैंने 4.1 के साथ कुछ परीक्षण किए, और यह ठीक काम करता है। यदि आप इसे उत्तर के रूप में लिखना चाहते हैं, तो मुझे इसे स्वीकार करने में खुशी होगी। –