2017-08-14 13 views
9

मेरे पास ब्लूटूथ बारकोड स्कैनर है जो ब्लूटूथ LE का समर्थन करता है और जब कोई स्कैन किया जाता है तो मैं बारकोड जानकारी प्राप्त करने का प्रयास कर रहा हूं।आप ब्लूटूथ LE डिवाइस से डेटा कैसे प्राप्त करते हैं

मैं इसे ठीक से जोड़ सकता हूं onServicesDiscovered को मेरे BluetoothGattCallback में बुलाया जाता है लेकिन मुझे यकीन नहीं है कि वहां से क्या करना है।

एक क्लासिक ब्लूटूथ कनेक्शन के साथ

आप एक BluetoothSocket से एक InputStream मिलेगा और तुम सिर्फ read() आप डेटा देने के लिए के लिए लेकिन मुझे यकीन है कि यह कैसे ब्लूटूथ LE साथ काम करता है नहीं कर रहा हूँ इंतजार करेंगे। मैंने BluetoothGattCharacteristic की संपत्ति की जांच के माध्यम से लूपिंग करने की कोशिश की और यदि इसकी पढ़ी गई संपत्ति है तो मैं gatt.readCharacteristic(characteristic); पर कॉल करता हूं लेकिन यह मुझे बेकार जानकारी देता है और इससे पहले कि मैं कुछ स्कैन करने का प्रयास करता हूं।

तो मैं स्कैनर से बारकोड डेटा कैसे प्राप्त करूं?

इस

मैं https://www.zebra.com/us/en/support-downloads/scanners/ultra-rugged-scanners/li3608-li3678.html

+0

क्या आपने [एंड्रॉइड के लिए स्कैनर एसडीके] (https://www.zebra.com/us/en/support-downloads/software/developer-tools/scanner-sdk-for-android.html) का प्रयास किया था? मुझे पता है कि आपके प्रश्न का शीर्षक जेनेरिक बीएलई डेटा पढ़ने के लिए पूछता है लेकिन आपको बारकोड स्कैनर में विशेष रुचि है, इसलिए इसके लिए यह एसडीके कच्चे डेटा को पढ़ने के बजाय एक अच्छा प्रारंभिक बिंदु प्रतीत होता है। –

+0

हाँ मुझे एसडीके काम पता है, लेकिन मुझे सिर्फ इस स्कैनर से अधिक समर्थन करने की आवश्यकता है, इसलिए मैं अपना ब्लूटूथ तर्क – tyczj

+0

रोल करना चाहता हूं तो आपको किस हिस्से में बिल्कुल समस्या है? विशेषताओं से सार्थक मूल्य कैसे प्राप्त करें? –

उत्तर

10

BLE उपकरणों के द्वारा उपलब्ध कराए गए आंकड़ों लक्षण कहा जाता है स्कैनर है। ये डेटा पैकेज विशेष रूप से गठित होते हैं, कड़े पैक बाइट एरे जो विशिष्ट सेवाओं के लिए विशिष्ट मानों को एन्कोड करते हैं। आप आधिकारिक ब्लूटूथ वेबसाइट पर Services देख सकते हैं। यहां आपको परिभाषित (आधिकारिक) जीएटीटी सेवाएं और संबंधित विशेषताएं मिलेंगी।

उदाहरण के लिए, आपके पास एक बीएलई साइकलिंग कंप्यूटर है जो गति और तालमेल की रिपोर्ट करता है। आप सूची में Cycling Speed and Cadence आइटम देखें। इस प्रविष्टि में सेवा के UUID (0x1816) और डेटा शीट का एक लिंक शामिल है जिसमें विशेषताएं हैं। अब यदि आप सेवा विशेषताओं तालिका पर जाते हैं, तो आपको कुछ प्रविष्टियां मिलेंगी। आप गति और तालमेल चाहते हैं, इसलिए आप CSC Measurement (प्रविष्टि के फ़ील्ड को खोलें) खोलेंगे जो आपको विशेषता की डेटा शीट पर ले जाता है। यहां आप वैल्यू फ़ील्ड्स तालिका देखेंगे जो विशिष्ट मानों को परिभाषित करता है जिन्हें विशेषता से पढ़ा जा सकता है।

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

BluetoothGattCharacteristic characteristic = ... ; 

int offset = 0; // we define the offset that is to be used when reading the next field 

// FORMAT_* values are constants in BluetoothGattCharacteristic 
// these represent the values you can find in the "Value Fields" table in the "Format" column 
int flags = characteristic.getIntValue(FORMAT_UINT8, offset); 

offset += 1; // UINT8 = 8 bits = 1 byte 

// we have to check the flags' 0th bit to see if C1 field exists 
if ((flags & 1) != 0) { 
    int cumulativeWheelRevolutions = characteristic.getIntValue(FORMAT_UINT32, offset); 
    offset += 4; // UINT32 = 32 bits = 4 bytes 

    int lastWheelEventTime = characteristic.getIntValue(FORMAT_UINT16, offset); 
    offset += 2; // UINT16 = 16 bits = 2 bytes 
} 

// we have to check the flags' 1st bit to see if C2 field exists 
if ((flags & 2) != 0) { 
    int cumulativeCrankRevolutions = characteristic.getIntValue(FORMAT_UINT16, offset); 
    offset += 2; 

    int lastCrankEventTime = characteristic.getIntValue(FORMAT_UINT16, offset); 
    offset += 2; 
} 

flags क्षेत्र क्योंकि यह संभव है कि डिवाइस डेटा, जैसे हर प्रकार की रिपोर्ट नहीं करता विशिष्ट बिट्स के लिए जांच की ज़रूरत है यह पहिया क्रांति की गिनती नहीं करता है। चयनित विशेषता की शीट में हमेशा इस क्षेत्र के बारे में प्रासंगिक जानकारी होती है (यदि मौजूद है)।

यह भी ध्यान देने योग्य बात प्रलेखन का कहना है कि कि

सीएससी मापन विशेषता (सीएससी सायक्लिंग गति और ताल को संदर्भित करता है) एक चर लंबाई एक झंडे क्षेत्र युक्त एक संरचना झंडे की सामग्री पर आधारित है और, के लायक है फ़ील्ड में एक या अधिक अतिरिक्त फ़ील्ड हो सकते हैं [...]

यह है तुम क्यों कल्पना नहीं कर सकते कि संचयी क्रैंक क्रांतियों मूल्य 7 बाइट्स पर पाया जा सकता है (8 + 32 + 16 बिट्स; 1 + 4 + 2 बाइट्स क्रमशः) ऑफसेट और ऑफसेट किया जाना चाहिए खेतों के साथ प्रगति के रूप में गिना जाता है।


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

+0

से डिवाइस के बावजूद मूल्यों को कैसे प्राप्त करें ठीक है, इसलिए मुझे उस विशिष्ट विशेषता को जानने की ज़रूरत है जिसे मैं ढूंढ रहा हूं और 'mGatt.setCharacteristicNotification (विशेषता, सत्य);' डिवाइस को बताने के लिए मैं कुछ जानना चाहता हूं इसके साथ बदलता है। फिर जब मैं करता हूं तो मुझे कैरेक्टरिस्ट चेंजेड 'पर वापस कॉल मिलता है और यही वह जगह है जहां आपके ऊपर वाला कोड आता है? इस प्रक्रिया में किसी भी वर्णनकर्ता के पास क्या भाग है? – tyczj

+0

उस स्टैक को बताकर जिसे आप विशेषताओं में बदलावों से अधिसूचित करना चाहते हैं, एक बात है, लेकिन आपको सर्वर (रिमोट डिवाइस) को भी बताना होगा कि आप इसे अधिसूचनाएं/संकेत भेजना चाहते हैं और यह वह जगह है जहां वर्णनकर्ता आते हैं चित्र। अधिक जानकारी के लिए कृपया [GATT अधिसूचनाएं प्राप्त करना] (https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#notification) देखें। नमूना 'CLIENT_CHARACTERISTIC_CONFIG' वर्णनकर्ता का यूयूआईडी ('0x2902') (दूसरों के साथ) [बीटी वेबसाइट] (https://www.bluetooth.com/specifications/gatt/descriptors) पर पाया जा सकता है। –

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