2011-11-02 29 views
25

मैं अपने विश्वविद्यालय के कुछ छात्रों के साथ एक साधारण ब्लूटूथ एंड्रॉइड एप्लिकेशन विकसित करने के लिए काम कर रहा हूं जिसका उपयोग सीरियल संचार (आरएफसीओएमएम) के लिए एक ब्लडूडियो मॉड्यूल से जुड़े एक आर्डिनो माइक्रोक्रोनरोलर के लिए किया जाएगा।ब्लूटूथ सक्षम Arduino microcontroller पर एक RFCOMM सॉकेट में एक एंड्रॉइड एप्लिकेशन को ठीक से कैसे कनेक्ट कर सकता हूं?

मेरे सर्वोत्तम ज्ञान के लिए, मैं RFCOMM/SPP 00001101-0000-1000-8000-00805F9B34FB के लिए सही ब्लूटूथ पता और यूयूआईडी का उपयोग कर रहा हूं। मेरा एप्लिकेशन एक धागा शुरू करता है जो BluetoothDevice.createRfcommSocketToServiceRecord(UUID) का उपयोग कर डिवाइस से कनेक्ट करने का प्रयास करता है। लेकिन एक कारण या किसी अन्य कारण के लिए, हम एक सफल कनेक्शन नहीं देख रहे हैं। ऑपरेशन हमेशा पर आने वाले BluetoothSocket पर आने वाले आमंत्रण से आता है जो उपरोक्त आमंत्रण से आता है।

जब मेरे HTC Evo पर परीक्षण किया, Gingerbread की एचटीसी के संस्करण, connect() कॉल आमतौर पर अपवाद संदेश के साथ असफल होता है "सेवा खोज नहीं शुरू हो सकता है।" मैंने कुछ पढ़ा और पाया कि कुछ ने कहा कि ब्लूटूथ स्टैक में आरएफसीओएमएम के लिए एचटीसी का कार्यान्वयन खराब था, इसलिए हमने इसे किसी अन्य छात्र के Samsung Galaxy S पर आज़माने का फैसला किया। कोड पहली बार चला गया, सब कुछ पूरी तरह से काम किया। Arduino microcontroller एक छोटी इलेक्ट्रिक मोटर से जुड़ा हुआ है जो उम्मीद के अनुसार काम करना शुरू कर दिया। मैंने इस बात से इनकार नहीं किया है कि समस्या माइक्रोकंट्रोलर की तरफ हो सकती है या नहीं।

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

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

private class ClientThread extends Thread { 

    private String _btAddress; 

    /** 
    * A handle to the local device's Bluetooth adapter hardware. 
    */ 
    private BluetoothAdapter _btAdapter = BluetoothAdapter.getDefaultAdapter(); 

    /** 
    * A handle to the remote device Bluetooth context. 
    */ 
    private BluetoothDevice _btRemoteDevice; 

    /** 
    * A handle to the Bluetooth serial socket. 
    */ 
    private BluetoothSocket _btSocket; 

    /** 
    * Constructor. 
    * @param btAddress The BluetoothHardware address. 
    */ 
    public ClientThread(String btAddress) 
    { 
     _btAddress = btAddress; 
    } 

    public void run() 
    { 
     // Retrieves the device identified by the _btAddress property. 
     _btRemoteDevice = retrieveDevice(); 
     if (_btRemoteDevice == null) 
      sendUIMessage(CONNECTION_BT_DEVICE_NOT_BONDED); 
     else 
      sendBeacon(); 
    } 

    /** 
    * Retrieves the device associated with this client thread. 
    * @return 
    */ 
    private BluetoothDevice retrieveDevice() 
    { 
     Set<BluetoothDevice> btDevices = _btAdapter.getBondedDevices(); 
     for (BluetoothDevice btd : btDevices) 
     { 
      String addr = btd.getAddress(); 
      String name = btd.getName(); 
      if (addr.equalsIgnoreCase(_btAddress)) 
       return btd; 
     } 
     return null; 
    } 

    /** 
    * Sends the beacon to the Bluetooth device. 
    */ 
    private void sendBeacon() 
    { 
     // Holds the output stream of the BluetoothDevice. 
     OutputStream os = null; 

     try 
     { 
      _btSocket = _btRemoteDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 

      //Method m = _btRemoteDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 
      //_btSocket = (BluetoothSocket) m.invoke(_btRemoteDevice, 1); 
      _btSocket.connect(); 
      os = _btSocket.getOutputStream(); 
      os.write('L'); 
     } 
     catch (IOException e) 
     { 
      String message = e.getMessage(); 
      e.printStackTrace(); 
      sendUIMessage(CONNECTION_FAILURE_IO); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      sendUIMessage(CONNECTION_FAILURE_UNKNOWN); 
     } 
     finally 
     { 
      try 
      { 
       if (_btSocket != null) 
        _btSocket.close(); 
      } 
      catch (IOException e) 
      { 
       System.out.println("Failed closing Bluetooth output stream."); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

संपादित करें: ब्लूटूथ मॉड्यूल एक MDFLY आरएफ-BT0417CB है। मुझे पता है कि Arduino पर चल रहा कोड बहुत अधिक नहीं है और बस Serial.available() और Serial.read() का उपयोग कर बीटी मॉड्यूल के साथ संचार कर रहा है। हालांकि मेरे पास जानकारी का एक नया टुकड़ा है जो अधिक उपयोग का हो सकता है। जब मेरा एप्लिकेशन सैमसंग डिवाइस पर स्थापित किया गया था, तो यह सिर्फ एक बार काम करता था, और बाद के परीक्षणों में विफल रहा। कुछ समय पहले, जिस दूसरे छात्र के साथ मैं काम कर रहा हूं, उसी एंड्रॉइड ऐप इनवेंटर (एक ड्रैग और ड्रॉप जीयूआई उपकरण जो तार्किक कामकाजी कलाकृतियों को भी बना सकता है) का उपयोग करने के लिए एक साधारण एप्लीकेशन बनाने के लिए उपयोग किया जाता है जो एक ही बीटी मॉड्यूल/आर्डिनो बोर्ड को जोड़ता है। उन्होंने कहा कि जब मेरा आवेदन स्थापित किया गया था, तो दूसरा आवेदन कभी भी बीटी मॉड्यूल से कनेक्ट करने में असमर्थ था, जिससे मुझे विश्वास होता है कि सिस्टम सोच रहा था कि संसाधन मेरे आवेदन को आवंटित किया गया था। मेरे ऐप को अनइंस्टॉल करने के बाद, दूसरा कनेक्ट करने में सक्षम था। उसके पास अन्य एप्लिकेशन के लिए सोर्स कोड नहीं है, लेकिन मैं ऐप इनवेंटर को अपने आप यह देखने के लिए जा रहा हूं कि यह उत्पन्न करने वाला स्रोत कोड उत्पन्न करता है या नहीं, यह कुछ अलग कर रहा है। मेरे सबसे अच्छे ज्ञान के लिए, मैं एंड्रॉइड के दस्तावेज में परिभाषित अधिकांश मानक प्रथाओं का अनुपालन कर रहा हूं, इसलिए शायद यह बीटी मॉड्यूल के बारे में कुछ अजीब बात है या तथ्य यह है कि आर्डिनो कोड प्रोग्रामिंग रूप से बीटी मॉड्यूल को नियंत्रित नहीं कर रहा है।

किसी अन्य संस्करण: मैं एक ब्लूटूथ विशेषज्ञ नहीं हूं, लेकिन हम आसपास एक काम करने में सक्षम थे। जैसा कि कुछ जानते हैं, सार्वजनिक ब्लूटूथडिवाइस एपीआई का एक समूह है, जो संकलन समय पर छिपा हुआ है, लेकिन प्रतिबिंब का उपयोग करके रनटाइम पर कानूनी रूप से सार्वजनिक है। उनमें से एक createRfCommSocket (int) है। यह एपीआई आधिकारिक दस्तावेज में नहीं है क्योंकि यह छिपा हुआ है, लेकिन आप इसे here पढ़ सकते हैं।मैंने अभी तक प्रलेखन समर्थित API के साथ यह कोशिश नहीं की है, लेकिन समस्या हैंडसेट और सीरियल बोर्ड के बीच एक समवर्ती समस्या का कुछ प्रतीत होता है। हैंडसेट ने एक संदेश भेजा, जो निश्चित रूप से अवरुद्ध कॉल है, और जब यह वहां से लौटा, तो कनेक्शन बंद कर दिया। सीरियल बोर्ड पर ढाल कनेक्शन को बंद कर देगी और इसलिए डेटा Arduino आवेदन के लिए उपलब्ध नहीं था। हमने एंड्रॉइड पक्ष पर डीबग मोड में सफल संचार को देखते हुए यह महसूस किया, लेकिन रिलीज मोड में विफलता। एंड्रॉइड पक्ष पर आधा दूसरी देरी जोड़ना, ब्लूटूथ सॉकेट के ट्रांसमिशन और क्लोजर के बीच इस मुद्दे को हल किया गया। मैं यह नहीं कह सकता कि क्या इस मुद्दे को आर्डिनो कोड द्वारा जिम्मेदार ठहराया गया था या नहीं, क्योंकि मैं वास्तुकला से बहुत परिचित नहीं हूं, लेकिन हम छात्रों के अनुभव का अभाव है इसलिए यह मुझे आश्चर्य नहीं करेगा।

+0

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

+0

डेनिस, आपकी प्रतिक्रिया के लिए धन्यवाद और कृपया मुझे वापस आने के लिए इतनी देर लगने के लिए मेरी माफी स्वीकार करें, परीक्षाएं और अन्य दायित्वों ने मुझे पकड़ लिया है। मैं arduino के मॉडल और सॉफ्टवेयर संस्करणों में देख रहा हूं, लेकिन मैंने बीटी डिवाइस और समस्या के बारे में कुछ नई जानकारी के बारे में कुछ जानकारी पोस्ट की है। –

+0

हाय, मुझे एक ही समस्या है ... मैं एक एलजी फोन को टीआई पैन 1315 देव से जोड़ने की कोशिश कर रहा हूं। बोर्ड, मुझे एक ही यूयूआईडी के साथ सॉकेट मिलता है, लेकिन कनेक्ट() हमेशा एक IOException फेंकता है। एम्बेडेड PAN1315 को डिबग करने के दौरान, मैंने कंसोल पर कुछ लॉग मुद्रित किए हैं, यह पता लगाने की कोशिश कर रहा है कि मैंने मूल एप्लिकेशन डिज़ाइन से कुछ गड़बड़ कर ली है, मुझे लगता है कि एक एचसीआई/एसीएल डिस्कनेक्शन अनुरोध फोन से आता है, न कि एम्बेडेड डिवाइस, एम्बेडेड डिवाइस से फोन पर एक लिंक कुंजी भेजने के बाद ... क्या आप सहमत हो सकते हैं? – TacB0sS

उत्तर

1
[Communication Between Android And Arduino With Bluetooth(1)][1] 

मुझे लगता है कि यह आपके लिए सहायक होगा। क्या आप इस पर कुछ विवरण दे सकते हैं। मैंने एक लिंक देखा है, आप इसे भी देख सकते हैं। मुझे बताएं कि यह सहायक है या नहीं? How to create Insecure RFCOMM Socket in Android?

+0

क्या आपको कोई भाग्य मिलता है? कृपया मुझे बताओ। – mH16

0

Amarino Toolkit विशेष रूप से एंड्रॉइड डिवाइस और ब्लूटूथ के साथ एक Arduino के बीच सीरियल ब्लूटूथ संचार की सुविधा के लिए बनाया गया था।