2015-04-16 10 views
7

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

final String tagUUID = "01122334-4556-6778-899a-abbccddeeff0"; 

//does not work 
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(UUID.fromString(tagUUID))).build(); 

//works 
ScanFilter filter = new ScanFilter.Builder().setDeviceAddress(tagMAC).build(); 
+0

मैं एक छोटे से लेख है जिसमें कहा गया है कि यह 4.3 के साथ एक आम समस्या है, लेकिन लॉलीपॉप के साथ तय हो गई है में पाया गया कि है। यदि आपके पास इस समस्या पर कोई अपडेट है तो कृपया उन्हें यहां उल्लेख करें क्योंकि मुझे एक ही समस्या का सामना करना पड़ रहा है और वास्तव में इसे हल करने के लिए वास्तव में सराहना की जाएगी। http://blog.conjure.co.uk/2014/08/ibeacons-and-android-parsing-the-uuid-major-and-minor-values/ :) – BigPenguin

उत्तर

2

यह संभव है कि फ़िल्टरिंग सेवा "यूयूआईडी" एडी टाइप विज्ञापन संरचना में यूयूआईडी की तलाश करे। जो वास्तव में समझ में आता है और इस तरह यह काम करना चाहिए।

बीकन के लिए, यूयूआईडी जिसे आप ढूंढने की कोशिश कर रहे हैं वास्तव में "निर्माता विशिष्ट डेटा" एडी प्रकार संरचना में स्थित है। और कोई भी सेवा UUIDs की तलाश करने की परवाह नहीं करता है।

मेरा मानना ​​है कि सेवा यूयूआईडी फ़िल्टरिंग केवल GATT डेटाबेस में सेवाओं के यूयूआईडी के लिए फ़िल्टर करने के लिए है; उन यूयूआईडीएस के रूप में स्थापित किया जाएगा जैसा कि मैंने पहले पैराग्राफ में समझाया था।

बीकन में यूयूआईडी एक सेवा UUID प्रति से नहीं है। यह एक यूयूआईडी प्रारूप के साथ एक बीकन पहचानकर्ता है।

8

मैं उपर्युक्त ब्लॉग पोस्ट का लेखक हूं। एंड्रॉइड 21+ के लिए अपनी समस्या को ठीक करने का तरीका यहां दिया गया है।

// Empty data 
byte[] manData = new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 

// Data Mask 
byte[] mask = new byte[]{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; 

// Copy UUID into data array and remove all "-" 
System.arraycopy(hexStringToByteArray("YOUR_UUID_TO_FILTER".replace("-","")), 0, manData, 2, 16); 

// Add data array to filters 
ScanFilter filter = new ScanFilter.Builder().setManufacturerData(76, manData, mask).build()); 

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
       + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 

यहां मुद्दा आप UUID को छानने में जोड़ सकते हैं, लेकिन इसके बिल्कुल सीधे आगे

+0

मई '1'' बाइट में [] मुखौटा '' (बाइट) 0xFF' हो? '1' केवल एलएसबी से मेल खाया जाएगा। – sumio

+0

नहीं, इस मामले में यह केवल डेटा के बारे में देखभाल करने के लिए स्कैन फ़िल्टर को बता रहा है या नहीं। अधिक जानकारी के लिए दस्तावेज़ देखें https://developer.android.com/reference/android/bluetooth/le/ScanFilter.Builder.html#setManufacturerData(int%2C%20byte%5B%5D%2C%20byte%5B%5D) "मुखौटा में किसी भी बिट के लिए, इसे 1 सेट करें यदि इसे निर्माता डेटा में से किसी एक से मिलान करने की आवश्यकता है, अन्यथा इसे 0 पर सेट करें" –

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