读取BLE周边特性并检查其值?

ben*_*_uk 8 bluetooth ios core-bluetooth swift

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

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

peripheral.readValueForCharacteristic(charactericsx)
Run Code Online (Sandbox Code Playgroud)

我想知道的是:我如何检查这个读取值是我正在寻找的.我希望能够执行if语句来检查我的值与该特征的已发现值.

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

这不是我想要做的很好的解释,但我希望你能得到主旨.

有谁知道怎么做这个?

Tra*_*ggs 12

更新了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 }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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 {}
Run Code Online (Sandbox Code Playgroud)