我正在使用在Xcode上使用Swift的应用程序,该应用程序连接到蓝牙BLE外设。我已经建立了与设备的连接,并想从特定特征(特别是服务UUID FFF0中的FFF1)读取一些数据。
如果要查找其信息的特征是,我可以使用以下代码请求特征的读取characteristicx:
characteristicx
peripheral.readValueForCharacteristic(charactericsx)
我想知道的是:如何检查此读取值是否是我要的值。我希望能够执行if语句,以针对该特征的发现值检查我的值。
例如:如果发现的值为X,则执行其他操作;否则,如果发现的值为Y,则执行其他操作。
这不是我要做什么的很好解释,但我希望您能理解。
有人知道该怎么做吗?
为Swift3更新
执行该方法后,delegate外围设备的将异步接收该peripheral(_:didUpdateValueFor:error:)方法。在该方法中,您可以查询value所传递characteristic参数的。value将是一个NSData你可以拉的字节出来。例如
delegate
peripheral(_:didUpdateValueFor:error:)
value
characteristic
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方法实际上返回的是Optional“期望值”附近的值Data,因此,放手一搏即可。
Optional
Data
通常,特性的最大20字节Data有效负载中将编码有一个简单值。例如,这可能是一个简单的UInt16计数器。至
要在这些Data混乱和有意义的数字之间进行转换,请看一下[往返于Swift的数字类型与数据之间]的答案(我在下面提供了自己的实现)。
因此,例如,如果您知道感兴趣的特征是某个计数器,该计数器将被提取为a UInt16,那么我将在上面的示例中填写以下内容:
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 {}