2015-10-01 7 views
5

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

मैं निम्नलिखित कोड का उपयोग कर विशेषताओं का एक पढ़ने का अनुरोध करने के अगर विशेषता यह है कि मैं के लिए जानकारी प्राप्त करना चाहते characteristicx है कर सकती हूं:

peripheral.readValueForCharacteristic(charactericsx) 

क्या मैं जानना चाहता हूँ यह है: मैं कैसे पता चलेगा कि यह पढ़ा गया मूल्य वह है जिसे मैं ढूंढ रहा हूं। मैं उस विशेषता के लिए खोज मूल्य के खिलाफ अपना मूल्य जांचने के लिए एक कथन करने में सक्षम होना चाहता हूं।

उदाहरण: यदि खोज मूल्य एक्स है तो कुछ करें, अन्यथा यदि खोज मूल्य वाई है तो कुछ और करें।

यह मैं जो करना चाहता हूं उसका एक बहुत अच्छा स्पष्टीकरण नहीं है, लेकिन मुझे उम्मीद है कि आपको जिंदगी मिल जाएगी।

कोई भी जानता है कि यह करने के बारे में कैसे जाना है?

उत्तर

11

Swift3

के लिए अपडेट किया गया आपको लगता है कि विधि पर अमल के बाद, अपने परिधीय की delegate एसिंक्रोनस रूप peripheral(_:didUpdateValueFor:error:) विधि प्राप्त करने के लिए जा रहा है। उस विधि में आप पास characteristic पैरामीटर के value से पूछ सकते हैं। value एक NSData होगा जो आप बाइट को बाहर खींच सकते हैं। जैसे

// MARK: - CBPeripheralDelegate 
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { 
    if let e = error { 
     print("ERROR didUpdateValue \(e)") 
     return 
    } 
    guard let data = characteristic.value else { return } 
    ... 
} 

value विधि वास्तव में उम्मीद Data के चारों ओर एक Optional देता है, तो एक लेट गार्ड जाने का रास्ता है।

आमतौर पर एक विशेषता के पास अप-टू -20-बाइट Data पेलोड में एन्कोड किया गया एक साधारण मूल्य होगा। जैसे शायद यह एक साधारण UInt16 काउंटर है।

इन Data चमक और सार्थक संख्याओं के बीच कनवर्ट करने के लिए, round trip Swift number types to/from Data के उत्तर पर एक नज़र डालें (मैंने नीचे अपना स्वयं का कार्यान्वयन शामिल किया है)।

उदाहरण के लिए, यदि आप जानते हैं कि ब्याज की विशेषता कुछ काउंटर है कि एक के लिए है एक UInt16 के रूप में निकाला जा रहा है, मैं बाहर ऊपर के उदाहरण की तरह कुछ के साथ भरने जाएगा:

// MARK: - CBPeripheralDelegate 
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { 
    if let e = error { 
     print("ERROR didUpdateValue \(e)") 
     return 
    } 
    guard let data = characteristic.value else { return } 
    print("counter is \(UInt16(data:data))") 
} 



// Data Extensions: 
protocol DataConvertible { 
    init(data:Data) 
    var data:Data { get } 
} 

extension DataConvertible { 
    init(data:Data) { 
     guard data.count == MemoryLayout<Self>.size else { 
      fatalError("data size (\(data.count)) != type size (\(MemoryLayout<Self>.size))") 
     } 
     self = data.withUnsafeBytes { $0.pointee } 
    } 

    var data:Data { 
     var value = self 
     return Data(buffer: UnsafeBufferPointer(start: &value, count: 1)) 
    } 
} 

extension UInt8:DataConvertible {} 
extension UInt16:DataConvertible {} 
extension UInt32:DataConvertible {} 
extension Int32:DataConvertible {} 
extension Int64:DataConvertible {} 
extension Double:DataConvertible {} 
extension Float:DataConvertible {} 
+0

के लिए धन्यवाद अपने बहुत वर्णनात्मक उत्तर! मैं एक नज़र डालूंगा और कल कोशिश करूँगा! एक बार फिर धन्यवाद! – BensTechTips

+0

आशा है कि कोई स्विफ्ट 3 के लिए इस कोड को अपडेट कर सकता है :) – Arefly

+0

स्विफ्ट 3 अपडेट हो गया –

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