2015-02-12 13 views
8

पर कनेक्ट करने योग्य है या नहीं, मैं बीकन को कॉन्फ़िगर करने के लिए एक प्रोजेक्ट पर काम कर रहा हूं। संचालित होने के बाद कुछ निश्चित समय, एक बीकन असंभव हो जाता है जब तक यह पावर-साइक्लेड न हो। कॉन्फ़िगर करने योग्य बीकन की एक सूची दिखाने के लिए, मैं कुछ विशेषताओं (ब्लूटूथ डिवाइस का नाम, विज्ञापन पैकेट में कुछ निर्माता डेटा) देख रहा हूं। मुझे यह भी जानने की जरूरत है कि यह "कनेक्ट करने योग्य" है, i। ई। यदि डिवाइस के लिए बीएलई विज्ञापन पैकेट में पीडीयू टाइप इंगित करता है कि यह कनेक्ट करने योग्य है। मैंने एंड्रॉइड ब्लूटूथ कक्षाओं को एंड्रॉइड 4.X और 5.X दोनों में उच्च और निम्न की खोज की है और मुझे कुछ भी नहीं मिला है जो मुझे यह जानकारी बताएगा।यह पता लगाने के लिए कि कोई बीएलई डिवाइस एंड्रॉइड

मुझे एहसास है कि बीकन कनेक्टिबिलिटी निर्धारित करने का एक तरीका यह है कि इसे कनेक्ट करना है, ई। जी .: device.connectGatt(...)। हालांकि, मैंने देखा है कि onConnectionStateChange पर कॉलबैक से पहले कभी-कभी दो मिनट लगते हैं STATE_DISCONNECTED के साथ वापस आते हैं। इसके अलावा, पर्यावरण में इन बीकन में से कई हो सकते हैं, और को कॉन्फ़िगर करने योग्य प्रत्येक के लिए कनेक्ट हो सकता है।

आईओएस इस विशेषता के बराबर CBCentralManagerDelegate कॉलबैक विधि centralManager:didDiscoverPeripheral:advertisementData:RSSI में महत्वपूर्ण CBAdvertisementDataIsConnectable तहत advertisementData शब्दकोश में पाया जा सकता है।

तो सवाल यह है कि क्या यह निर्धारित करने के लिए एंड्रॉइड पर कोई तरीका है कि कोई बीएलई डिवाइस विज्ञापन डेटा से "कनेक्ट करने योग्य" है या परिणाम स्कैन या ...?

उत्तर

7

अद्यतन: एंड्रॉयड हे SDK में अंतिम रूप APIs के रूप में, ScanResult वर्ग (अपने आप Android 5.0 के रूप में जोड़ा) अब isConnectable() विधि है। कनेक्ट करने योग्य विज्ञापनों का पता लगाना केवल एंड्रॉइड 8.0+ पर संभव है। अधिक जानकारी के लिए यहां देखें: https://developer.android.com/reference/android/bluetooth/le/ScanResult.html#isConnectable()

एंड्रॉइड 8.0 से पहले, दुर्भाग्य से यह संभव नहीं है।

एक कनेक्शन विज्ञापन PDU हैडर बाइट 0. से निर्धारित होता है आप नीचे दिए गए उदाहरण संरचना में देख सकते हैं:

d6 be 89 8e # Access address for advertising data (this is always the same fixed value) 
40 # Advertising Channel PDU Header byte 0. Contains: (type = 0), (tx add = 1), (rx add = 0) 
24 # Advertising Channel PDU Header byte 1. Contains: (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.) 
05 a2 17 6e 3d 71 # Bluetooth Mac 

समस्या उपकरणों पर है 8.0 Anroid करने से पहले, एंड्रॉयड स्कैनिंग API आपको देना नहीं इन शीर्षकों तक पहुंच।

onLeScan(BluetoothDevice device, rssi, byte[] scan data) 

स्कैन डेटा बाइट सरणी के बाद हैडर बाइट्स ऊपर उल्लेख किया है शुरू होता है: आप वास्तव में Android 4.x के कॉलबैक में तीन क्षेत्रों मिलता है। और मैं BluetoothDevice परिभाषा के बारे में क्या देख सकता हूं, फ़ील्ड या विधियों में से कोई भी आपको बताता है कि यह कनेक्ट करने योग्य विज्ञापन नहीं है - क्लास ब्लूटूथ मैक पते के लिए सिर्फ एक कंटेनर है जिसमें ब्लूटूथ स्टैक पर फ़ंक्शंस का उपयोग करने के तरीके हैं। और IBluetooth.aidl में कोई विधि नहीं है जो ब्लूटूथ स्टैक के लिए निजी इंटरफ़ेस है (और BluetoothDevice इसकी जानकारी प्राप्त करने के लिए कॉल करता है) जो यह ध्वज प्राप्त कर सकता है।

ऐसा प्रतीत होता है कि यह जानकारी एंड्रॉइड 8.0 से पहले ब्लूड्रॉइड स्टैक से जावा परत तक नहीं पारित की गई है।

+0

यह देखते हुए कि अपने दावे मेरे अपने निष्कर्षों से तालमेल, मुझे लगता है कि इस सवाल का जवाब यहाँ कोई जवाब नहीं है कि वहाँ है। :-( – mharper

+1

मुझे इस समय सही होने के लिए बहुत खेद है। – davidgyoung

+0

यह अब एंड्रॉइड ओ – davidgyoung

4

यह संभव होना चाहिए क्योंकि नॉर्डिक के एनआरएफ मास्टर कंट्रोल पैनल ऐसा करता है।

कुछ खोदने के बाद मुझे लगता है कि मुझे पता है कि यह कैसे करता है। मुझे यकीन नहीं है कि यह करने का सही तरीका है।

मैंने LE Advertiser का उपयोग करने और डिवाइस को कनेक्ट करने योग्य के रूप में सेट करने का प्रयास किया।नॉर्डिक ऐप में, scanResult.getFlags() पर पाए गए बाइट्स के आधार पर एक डिवाइस को कनेक्ट करने योग्य के रूप में सेट किया जाता है।

मैंने पाया कि इस कोड को मेरी उपकरणों के लिए काम करता है:

int flags = scanResult.getScanRecord().getAdvertiseFlags(); 
if ((flags & 2) == 2) { 
    //connectable 
} 
+0

के रूप में संभव है। 'ScanRecord' ऑब्जेक्ट एंड्रॉइड 5.0 में जोड़ा गया था। क्या आप जानते हैं कि एनआरएफ मास्टर कंट्रोल पैनल केवल यह करता है या नहीं एंड्रॉइड 5+ डिवाइस? अगर यह एंड्रॉइड 4.x उपकरणों पर काम करता है, तो इसका दूसरा तरीका होना चाहिए। – davidgyoung

+1

मैं इन परिणामों को पुन: पेश नहीं कर सकता। मैंने एंड्रॉइड 5 बीएलई एपीआई का उपयोग करके रैडबीकॉन यूएसबी के लिए नेक्सस 9 स्कैनिंग पर इसका परीक्षण किया। मैंने इसे रखा रैडबीकॉन कनेक्ट करने योग्य मोड में (इसे टीआई सीसी 2540 स्कैनर का उपयोग करके सत्यापित करना), और एंड्रॉइड 'scanResult.getScanRecord()। getAdvertiseFlags() 'लौटाया गया 6. मैंने फिर रैडबीकॉन यूएसबी को गैर-कनेक्ट करने योग्य मोड में बदलने के लिए बदल दिया (फिर से इसे सत्यापित कर रहा था स्कैनर), और 'scanResult.getScanRecord()। getAdvertiseFlags() 'अभी भी वापस आ गया है। अतिरिक्त सुनिश्चित करने के लिए यह केवल एक कैशिंग समस्या नहीं थी, मैंने ब्लूटूथ को चालू/चालू कर दिया, फिर बीकन में प्लग किया। यह अभी भी 6 लौटा। – davidgyoung

+0

मेरे अनुभव में "कनेक्ट करने योग्य" ध्वज के बारे में कुछ प्रकार की असहमति प्रतीत होती है और यह कल्पना पूरी तरह से स्पष्ट नहीं है (या मैं पूरी परिभाषा नहीं ढूंढ पा रहा हूं)। मैंने सीएसआर बीकन के साथ काम किया है, जहां आप LE खोजने योग्य मोड ध्वज को सत्य पर सेट करते हैं, यह कनेक्ट करने योग्य और ब्लूगिगा बीकन के साथ भी दिखता है जहां खोजने योग्य मोड ध्वज कनेक्ट करने योग्य ध्वज पर कोई प्रभाव नहीं डालता है। यदि आप नॉर्डिक ऐप आज़माते हैं तो आपको शायद पता चलेगा कि आपका रैडबीकॉन कनेक्ट करने योग्य के रूप में दिखाई देता है। और हाँ, मेरा मानना ​​है कि नॉर्डिक ऐप <5.0 पर काम करता है, इसलिए – user3934907

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