BLE (ब्लूटूथ लो एनर्जी) पर Android डिवाइस को iOS डिवाइस से कैसे कनेक्ट करें


82

मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं, जो एंड्रॉइड के नए ब्लूटूथ लो एनर्जी एपीआई का उपयोग करता है। इसके लिए, मैंने एपीआई स्तर 18 के साथ आने वाले बीएलई नमूने के साथ शुरुआत की ।

जैसा कि मैंने पढ़ा है कि एंड्रॉइड पेरिफेरल के रूप में कार्य नहीं कर सकता है, मैंने एंड्रॉइड फोन को केंद्रीय मोड में रखा, इसके चारों ओर BLE उपकरणों के लिए स्कैनिंग । इस उद्देश्य के लिए, मैंने नॉर्डिक प्लेटफॉर्म के साथ हार्ट सेंसर का अनुकरण करते हुए कुछ परीक्षण किए। सब कुछ सही तरीके से काम करता है!

इसके बाद, मैं एक iPhone (iOS 7 बीटा 4) को लेने और एक पेरिफेरल तरीके से डालने की कोशिश करता हूं और पिछले परीक्षण के रूप में हार्ट रेट सेंसर का अनुकरण करता हूं । एंड्रॉइड ऐप डिवाइस को देखने और उससे कनेक्ट करने में सक्षम है। लेकिन कनेक्शन सक्रिय होने के बाद, 2 डिवाइस 3-4 सेकंड में एक-दूसरे से डिस्कनेक्ट हो जाते हैं। इसके अलावा, जब मैं Android पर searchServices () को कॉल करता हूं, तो कोई कॉलबैक ट्रिगर नहीं होता है! कुछ मामलों में एंड्रॉइड डिवाइस "कनेक्टेड" इवेंट प्राप्त करता है, भले ही आईओएस ब्लूटूथ चिप बंद हो। यह बहुत अजीब है। यह साबित करने के लिए, मैंने नॉर्डिक बोर्ड को केंद्रीय मोड में रखा और मैं बिना किसी समस्या के आईओएस डिवाइस से कनेक्ट करने में सही ढंग से सक्षम था।

यह क्या हो सकता है? एंड्रॉइड या आईओएस पर कुछ सीमाएं हैं जो एंड्रॉइड से आईओएस या वाइसवर्स से कनेक्ट करने की अनुमति नहीं देती हैं?

धन्यवाद।

EDIT: कुछ कठिन परीक्षण के बाद, मैंने AOSP पृष्ठ पर एक मुद्दा उठाया। इसे यहां चेक किया जा सकता है


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

आप सही हे। मैंने पहले से ही ब्लूटूथ गटस्वर के बारे में डॉक्टर बग को ढूंढ लिया है। आप के पास GPServer का उदाहरण getProfileProxy विधि (जैसा कि डॉक्टर कहते हैं) नहीं हो सकता है, लेकिन आप BluetoothManager.openGattServer () से प्राप्त कर सकते हैं। यह पहले से ही एक समस्या के रूप में Google को सूचित कर दिया गया है। वैसे भी, हाँ Android एक GattServer के रूप में कार्य कर सकता है लेकिन यह विज्ञापन नहीं कर सकता है। यदि आप रुचि रखते हैं, तो मैं पहले से ही परीक्षण कर चुका हूं और 2 उपकरणों के शमन के बाद, रिमोट एंड्रॉइड से उजागर गैट सर्वर को देख सकता है। इस प्रश्न के बारे में मेरी समस्या रिपोर्ट देखने के लिए पहले उत्तर की टिप्पणियों की जाँच करें।
edoardotognoni

हाँ, मैं उस पर भी ठोकर खाई और उस मुद्दे पर मेरे दो सेंट जोड़ दिए। अब मेरे पास एक थर्मामीटर सर्वर है जो विज्ञापन नहीं कर सकता है इसलिए मैं इसका उपयोग नहीं कर सकता।
ब्रायन रीनहोल्ड

मैंने लगभग आपके समान एक धागा खोला: stackoverflow.com/questions/18410081/… मैं आपको जो भी समाधान मिलेगा, उसके लिए मैं यह धागा देखूंगा।
शाम

प्रश्न के EDIT अनुभाग में पोस्ट किया गया Android मुद्दा पढ़ें। यह स्पष्ट रूप से समझाता है कि यह प्रक्रिया क्यों विफल हो रही है। यह एक Android गलती है जो हमें लगता है। मुख्य रूप से एक निश्चित BLE चैनल पर अनुमति नहीं संदेश भेज रहा है। मुझे लगता है कि केवल एक चीज जो हम कर सकते हैं वह है एक नए एंड्रॉइड रिलीज़ का इंतजार करना :(
edoardotognoni

जवाबों:


7

संदर्भ के लिए एक सारांश जोड़ना:

यह क्या हो सकता है? एंड्रॉइड या आईओएस पर कुछ सीमाएं हैं जो एंड्रॉइड से आईओएस या वाइसवर्स से कनेक्ट करने की अनुमति नहीं देती हैं?

ConnectGatt (...) को कॉल करके एक GATT सर्वर से कनेक्ट किया गया है, जिसे dualmode (BLE और BR / EDR) डिवाइस के रूप में विज्ञापित किया गया है, आंतरिक रूप से जोड़ा गया TRANSPORT_AUTO BR (EDR मोड ) ( लिंक ) के लिए डिफ़ॉल्ट रूप से Android बनाता है ।

निम्नलिखित वर्कअराउंड संभव हैं:

  1. परिधीय पक्ष: उचित झंडे ( लिंक ) को समायोजित करके विज्ञापन बीआर / ईडीआर क्षमताओं को रोकें
  2. केंद्रीय पक्ष: ट्रांसपोर्ट पैरामीटर को ट्रांसपोर्ट_से कनेक्ट करें जो कनेक्टगैट () के छिपे हुए संस्करण को प्रतिबिंब का उपयोग करके ट्रांसपोर्ट_एल पर सेट करता है

उदाहरण:

public void connectToGatt(BluetoothDevice device) {    
   ...    
   Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);    
   int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);     // LE = 2, BREDR = 1, AUTO = 0    
   BluetoothGatt mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);    
   ... 
}

4/2016 को संपादित करें

जैसा कि अर्बेल इज़राइली ने टिप्पणी में बताया, Google ने कनेक्टगैट (...) का एक अतिभारित संस्करण पेश किया, जो एंड्रॉइड एम में परिवहन को निर्दिष्ट करने की अनुमति देता है ।


धन्यवाद, जो मेरे लिए काम करता है, ध्यान दें कि एंड्रॉइड एम गूगल ने कनेक्टगैट विधि के लिए एक अधिभार जोड़ा है जो एक परिवहन चर लेता है: कनेक्टगैट (संदर्भ संदर्भ, बूलियन ऑटोकनेक्ट, ब्लूटूथगैटल कॉलबैक, इंट ट्रांसपोर्ट)
arbel03

1
ओह इस संकेत के लिए धन्यवाद, इसलिए उन्होंने इसे आखिरकार उपलब्ध कराया।
डोमिनिक गेभरत

2

मैंने एक साधारण कामकाजी उदाहरण लिखा है, अच्छी तरह से अपेक्षाकृत सरल है, और इसे Github पर ओपन-सोर्स में शामिल किया है: https://github.com/GitGarage । अब तक यह केवल एंड्रॉइड नेक्सस 9 और आईफोन 5 एस के साथ परीक्षण किया गया है, लेकिन मुझे लगता है कि यह नेक्सस 6 और विभिन्न आईफोन प्रकारों के साथ भी काम करेगा। अब तक यह स्पष्ट रूप से एक Android और एक iPhone के बीच संवाद स्थापित करने के लिए स्थापित किया गया है, लेकिन मुझे लगता है कि यह और अधिक करने के लिए tweakable है।


2

शायद थोड़ा विलंब हुआ, लेकिन शायद आपके दर्द से थोड़ा राहत मिल सकती है;)

हम क्रॉस प्लेटफॉर्म BLE कनेक्शन (iOS <-> एंड्रॉइड) के साथ बहुत प्रयोग कर रहे हैं और सीखा है कि अभी भी कई असंगतताएं और कनेक्शन समस्याएं हैं। एंड्रॉइड की अस्थिरता के अलावा, आपको इस बात पर भी विचार करना चाहिए कि आज भी, ऐसा नहीं है कि कई एंड्रॉइड डिवाइस वास्तव में बीएलई पेरिफेरल मोड का समर्थन करते हैं।

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

उदाहरण के लिए: http://p2pkit.io या पास का Google

अस्वीकरण: मैं Uepaa के लिए काम करता हूं, Android और iOS के लिए P2pkit.io विकसित कर रहा हूं।



0

आईओएस डिवाइस हमेशा एक परिधीय या केंद्रीय लेकिन एंड्रॉइड डिवाइस नहीं हो सकते हैं। इस मामले में आपका आईओएस डिवाइस एक परिधीय होना चाहिए और एंड्रॉइड एक केंद्रीय होना चाहिए। हम सोच सकते हैं कि परिधीय एक सर्वर है और केंद्रीय क्लाइंट है। यह सरल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.