7

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

  1. चेक विभिन्न ब्लूटूथ स्थितियां:

    यहाँ सर्वर साइड पर चीजों के अनुक्रम है।

  2. कॉल सुनोयूसिंगरफॉम WithServiceRecord() जिसे मैंने चुना है पूर्व-परिभाषित यूयूआईडी के साथ।
  3. डिवाइस खोजने योग्य बनाने के लिए अनुरोध
  4. खोजे जाने योग्य होने के बाद से, मैं स्वीकार करता हूं() और आने वाले कनेक्शन की प्रतीक्षा करता हूं।

ग्राहक के पक्ष में:

  1. चेक विभिन्न ब्लूटूथ स्थितियों (अनुकूलक उपलब्ध, सक्षम किया गया है, आदि)। GetBondedDevices() में प्रत्येक डिवाइस के लिए
  2. , मैं सर्वर नाम के साथ getName() की तुलना करता हूं। यदि कोई मैच है, तो चरण 6 पर जाएं।
  3. प्रारंभ बीटी डिस्कवरी
  4. प्रत्येक खोजे गए डिवाइस के लिए (ध्यान दें कि 2a से जोड़े गए डिवाइस यहां दिखाई नहीं देते हैं), डिवाइस के नाम की तुलना सर्वर के नाम से करें। यदि कोई मैच है, तो चरण 6 पर जाएं।
  5. खोज रद्द करें
  6. चरण 2 से मिले डिवाइस पर, उसी तरफ से परिभाषित यूयूआईडी के साथ createRfcommSocketToServiceRecord() को कॉल करें जो सर्वर पक्ष पर उपयोग किया गया था।
  7. कॉल कनेक्ट() और कनेक्ट सॉकेट को वापस करने के लिए प्रतीक्षा करें।

उपर्युक्त प्रक्रिया मेरे लिए बिल्कुल ठीक काम करती है जब ग्राहक और सर्वर को पहले कभी जोड़ा नहीं गया है। हालांकि, एंड्रॉइड के बाद उन्हें डिवाइस सूची में पंजीकृत करने के बाद, वे अनिवार्य रूप से कनेक्ट()/स्वीकार() चरण पर टाइमआउट करेंगे।

मैं अब कुछ दिनों के लिए एक समाधान के लिए खोज की है और इसे मिलाकर काफी कुछ बातें की कोशिश की है: Connecting to a already paired Bluetooth device

प्रतिबिंब विधि या तो मेरे लिए काम नहीं करता। ऐसा लगता है कि कनेक्ट() तुरंत वापस आ जाएगा लेकिन जब मैंने आउटपुटस्ट्रीम प्राप्त करने की कोशिश की() मुझे अपवाद मिलता है। स्वीकृति() पक्ष पर यह पंजीकरण भी नहीं करता है कि किसी ने कनेक्ट करने का प्रयास किया है। उपकरणों को एक बार स्थापित करने के बाद उपकरणों को स्थापित करने के लिए मुझे कुछ मदद या सूचक की गंभीरता से आवश्यकता है।

  • मैं दो एलजी G2X फोन पर सर्वर और ग्राहक का परीक्षण कर रहा हूँ:

    यहाँ उपकरणों के बारे में कुछ जानकारी है।

  • दोनों एंड्रॉइड 2.3.3 पर चलते हैं, जो एपीआई स्तर 10 के अनुरूप है।
  • फिर से, उपरोक्त काम करता है जब मैं सेटिंग्स में मैन्युअल रूप से डिवाइस को अनपेयर करता हूं।

समय से पहले धन्यवाद। मैं एंड्रॉइड और ब्लूटूथ में लगभग 2 सप्ताह का हूं, इसलिए यदि आप किसी भी लापता कदम या सर्वोत्तम प्रथाओं को देखते हैं, तो कृपया उन्हें भी इंगित करें।

उत्तर

6

क्लाइंट में जब मैं किसी बंधुआ डिवाइस से कनेक्शन बनाने का प्रयास करता हूं, तो मैंने इसे BluetoothAdapter.getBondedDevices() में मिले ब्लूटूथडिवाइस पर बुलाया। यह काम नहीं करता। Bluetooth Chat Service:

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices(); 
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress()); 

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID); 
socket.connect(); 

मैं बिल्कुल निम्नलिखित ब्लूटूथ उदाहरण बातचीत के द्वारा इस उत्तर पहुंचे:

ताकि ठीक से ब्लूटूथ कनेक्शन स्थापित करने में, मैं नीचे स्यूडोकोड के लिए इसी तरह कुछ करने के लिए किया था। यह डिवाइस पर काम नहीं करता है getBondedDevices() से परे मेरे बाहर है। हो सकता है कि एंड्रॉइड के अधिक अंतरंग ज्ञान वाला कोई जवाब दे सके।

+0

getRemoteDevice एक स्थिर विधि, आप कैसे यह हमेशा बुला रहे हैं – raja

+1

आप (लगभग?) अपने BluetoothAdapter रूप BluetoothAdapter.getDefaultAdapter उपयोग करने के लिए() चाहते हैं नहीं है। उपरोक्त केवल छद्म कोड है, इसलिए आप बस कॉपी और पेस्ट नहीं कर सकते हैं। –

+0

ग्रेट पोस्ट, यह वास्तव में समझ में आता है क्योंकि डिवाइस एक संदर्भ है और बासी हो जाएगा। एडाप्टर हमेशा अद्यतित होगा। – Cookster

0
private static BluetoothSocket mSocket; 
BluetoothDevice selectDevice = null; 

void connectDevice(){ 
    if(mSocket == null) { 
     //Log.d(TAG, "Socket is null"); 
     UUID SPP_UUID = UUID 
       .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 
     Set<BluetoothDevice> bondedDevices = BluetoothAdapter 
       .getDefaultAdapter().getBondedDevices(); 
     //Log.d(TAG, "Size: " + bondedDevices.size()); 
     /** 
     * Select your divice form paired devices 
     */ 
     for (BluetoothDevice bluetoothDevice : bondedDevices) { 
      selectDevice = bluetoothDevice; 
      //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()); 
     } 

     if(selectDevice.getBondState() == selectDevice.BOND_BONDED) { 
      //Log.d(TAG, selectDevice.getName()); 
      try { 
       mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       //Log.d(TAG, "socket not created"); 
       e1.printStackTrace(); 
      } 
      try { 
       mSocket.connect(); 
      } catch (IOException e) { 
       try { 
        mSocket.close(); 
        //Log.d(TAG, "Cannot connect"); 
       } catch (IOException e1) { 
        //Log.d(TAG, "Socket not closed"); 
        e1.printStackTrace(); 
       } 
      } 
    }