2015-10-01 8 views
5

Ich schreibe eine App mit Swift auf Xcode, die mit einem Bluetooth BLE-Peripheriegerät verbindet. Ich habe eine Verbindung zu einem Gerät hergestellt und möchte einige Daten eines bestimmten Merkmals lesen (speziell FFF1 in Service UUID FFF0).Eine BLE-Peripherie-Eigenschaft lesen und ihren Wert überprüfen?

Ich bin in der Lage eine Lese von Merkmalen mit dem folgenden Code zu verlangen, wenn die Eigenschaft, die ich Infos finden wollen für characteristicx ist:

peripheral.readValueForCharacteristic(charactericsx) 

Was ich wissen möchte, ist dies: Wie kann ich überprüfen dass dieser gelesene Wert ist, was ich suche. Ich möchte in der Lage sein, eine if-Anweisung zu machen, um meinen Wert mit dem ermittelten Wert für dieses Merkmal zu vergleichen.

Bsp: Wenn der entdeckte Wert X ist, dann tue etwas, sonst, wenn der entdeckte Wert Y ist, dann tu etwas anderes.

Das ist keine sehr gute Erklärung für das, was ich tun möchte, aber ich hoffe, Sie bekommen das Wesentliche.

Wer weiß, wie man das macht?

Antwort

11

Für swift3 Aktualisiert

Nachdem Sie diese Methode ausführen, wird die delegate Ihrer peripheren asynchron die peripheral(_:didUpdateValueFor:error:) Methode erhalten. In dieser Methode können Sie den value des übergebenen characteristic Parameters abfragen. value wird ein NSData sein, aus dem Sie die Bytes herausziehen können. Z.B.

// 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 } 
    ... 
} 

Die value Methode gibt tatsächlich eine Optional um die erwartete Data, so ein let Wache ist der Weg zu gehen.

Normalerweise wird ein Merkmal einen einfachen Wert haben, der in seiner bis zu 20 Byte hohen Nutzlast codiert ist. Z.B. Vielleicht ist es ein einfacher UInt16 Counter. Zu

Um zwischen diesen Data glumps und aussagekräftige Zahlen zu konvertieren, werfen Sie einen Blick auf die Antwort auf round trip Swift number types to/from Data (Ich habe meine eigene Implementierung der unten enthalten).

So zum Beispiel, wenn Sie wissen, dass das Merkmal von Interesse einige Zähler, der eine als UInt16 extrahiert werden soll, würde ich das obige Beispiel mit so etwas wie ausfüllen:

für
// 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

Dank Ihrer sehr beschreibende Antwort! Ich werde es mir ansehen und es morgen versuchen! Danke noch einmal! – BensTechTips

+0

Hoffe jemand kann diesen Code für Swift 3 aktualisieren :) – Arefly

+0

Swift3 Update Fertig –

Verwandte Themen