2015-04-18 12 views
5

क्या ब्लूटूथ लो एनर्जी (बीएलई) डिवाइस से स्वचालित रूप से कनेक्ट करना संभव है?एंड्रॉइड में ब्लूटूथ कम ऊर्जा डिवाइस को जोड़ना

Android documentation इंगित करता है कि [BluetoothDevice.connectGatt()] (https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context, बूलियन, android.bluetooth.BluetoothGattCallback)) एक AutoConnect पैरामीटर है: यह के रूप में के रूप में जल्द

बूलियन यह बताते हैं कि स्वचालित रूप से BLE डिवाइस से कनेक्ट करने के

हालांकि, इसे कॉल करने के लिए, आपको पहले BluetoothDevice की आवश्यकता है। AFAIK इसे प्राप्त करने का एकमात्र तरीका उपलब्ध उपकरणों को स्कैन करके है। किसी डिवाइस से कनेक्ट करने के लिए हर बार एक स्कैन सेट करना वांछनीय तरीके से प्रतीत नहीं होता है। इसके अलावा, मैंने autoConnect = true का उपयोग करके अपने परिधीय से कनेक्ट करने के लिए nRF Control Master Panel का उपयोग करने का प्रयास किया, लेकिन यह डिवाइस से कनेक्ट नहीं है। autoConnect के बिना कनेक्ट करने से यह कनेक्ट हो जाता है, और मैं सफलतापूर्वक इस तरह से अपने परिधीय से डेटा पढ़ने और लिखने में कामयाब रहा हूं।

ब्लूटूथ में सामान्य तरीके से दो डिवाइस जोड़े गए हैं। हालांकि, मेरे बीएलई डिवाइस की खोज करना और BluetoothDevice.createBond() का उपयोग करना प्रतीत नहीं होता है। मेरे ACTION_BOND_STATE_CHANGED -कॉलबैक में, EXTRA_BOND_STATE और EXTRA_PREVIOUS_BOND_STATE बस BOND_BONDING से BOND_NONE और पीछे जाएं। मैं एक त्रुटि या कुछ भी नहीं पढ़ता - तो शायद मैं यहाँ कुछ याद कर रहा हूँ। यहां कॉलबैक है:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 
     if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { 

      final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); 
      final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR); 

      Log.e(TAG, "prevState " + prevState + ", state " + state); 
     } 
    } 
}; 

तो इस प्रकार का बंधन काम नहीं कर रहा है।

मेरा सवाल है: क्या मैं युग्मन या ऑटोकनेक्ट के लिए कुछ गलत कर रहा हूं? या फिर मैं वर्तमान में यह एकमात्र सही तरीका कैसे काम कर रहा हूं? यह वास्तविक दर्द (और बैटरी-नाली) की तरह लगता है कि हर बार उपकरणों के लिए स्कैन करना है, देखें कि डिवाइस वहां है या नहीं, अगर डेटा पढ़ा जाए और कल वापस जांचें, अन्यथा एक घंटे या उससे भी ज्यादा समय में जांचें। ब्लूटूथ का मुद्दा यह है कि जब भी यह निकट हो, इसे सीधे जोड़ना चाहिए, है ना?

उत्तर

5

यह बिना किसी रेस्कैन के काम करता है। आपको जोड़ी की जरूरत नहीं है। पहले कनेक्शन से प्राप्त गैट ऑब्जेक्ट के लिए बस BluetoothGatt.connect() पर कॉल करें। जैसे ही ब्ली डिवाइस फिर से उपलब्ध होगा, आपको onConnectionStateChange ईवेंट BluetoothGattCallback में प्राप्त होगा। यदि आप ऑटोकनेक्ट विकल्प का उपयोग करते हैं, तो आपको BluetoothGatt.connect() विधि को कॉल करने की भी आवश्यकता नहीं है। बस अपने क्लॉबैक की निगरानी करें, और close() के साथ ब्लूटूथगैट को बंद करना न भूलें यदि आपको बहुत लंबा कनेक्शन नहीं दिखता है।

और हाँ, पहले कनेक्शन प्राप्त करने के लिए आपको BluetoothAdapter.startLeScan के साथ ब्लू डिवाइस स्कैन करना चाहिए, सामान्य ब्लूटूथ डिवाइस स्कैन नहीं।

+0

तो जब भी ऐप शुरू होता है, पहली बार मुझे इसके लिए स्कैन करना पड़ता है? जोड़ों के उपकरणों के विरोध में एक बहुत उपयोगकर्ता के अनुकूल विधि की तरह प्रतीत नहीं होता है। – jdepypere

+1

हां, एंड्रॉइड ब्ली स्टैक बिल्कुल उपयोगकर्ता के अनुकूल नहीं है)))) सभी async, प्रत्येक स्टार्टअप पर rescan, आदि ... आप चिपचिपा सेवा में सभी को रखने की कोशिश कर सकते हैं, लेकिन अगर यह बंद हो जाएगा - आप ' ब्ली rescan की आवश्यकता होगी। – Raiv

+0

ठीक है, सोचा कि मुझे कुछ याद आ रहा था क्योंकि मैंने सोचा था कि बीएलई बड़े पैमाने पर समर्थित होगा ... – jdepypere

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