一尘不染

读取BLE外围设备特性并检查其值?

swift

我正在使用在Xcode上使用Swift的应用程序,该应用程序连接到蓝牙BLE外设。我已经建立了与设备的连接,并想从特定特征(特别是服务UUID
FFF0中的FFF1)读取一些数据。

如果要查找其信息的特征是,我可以使用以下代码请求特征的读取characteristicx

peripheral.readValueForCharacteristic(charactericsx)

我想知道的是:如何检查此读取值是否是我要的值。我希望能够执行if语句,以针对该特征的发现值检查我的值。

例如:如果发现的值为X,则执行其他操作;否则,如果发现的值为Y,则执行其他操作。

这不是我要做什么的很好解释,但我希望您能理解。

有人知道该怎么做吗?


阅读 221

收藏
2020-07-07

共1个答案

一尘不染

为Swift3更新

执行该方法后,delegate外围设备的将异步接收该peripheral(_:didUpdateValueFor:error:)方法。在该方法中,您可以查询value所传递characteristic参数的。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方法实际上返回的是Optional“期望值”附近的值Data,因此,放手一搏即可。

通常,特性的最大20字节Data有效负载中将编码有一个简单值。例如,这可能是一个简单的UInt16计数器。至

要在这些Data混乱和有意义的数字之间进行转换,请看一下[往返于Swift的数字类型与数据之间]的答案(我在下面提供了自己的实现)。

因此,例如,如果您知道感兴趣的特征是某个计数器,该计数器将被提取为a 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 {}
2020-07-07