【问题标题】:Reading a BLE Peripheral Characteristic and checking its value?读取 BLE 外设特性并检查其值?
【发布时间】:2015-12-29 21:47:39
【问题描述】:

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

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

peripheral.readValueForCharacteristic(charactericsx)

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

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

这不是我想要做的一个很好的解释,但我希望你明白要点。

有人知道怎么做吗?

【问题讨论】:

    标签: ios swift bluetooth core-bluetooth


    【解决方案1】:

    为 Swift3 更新

    执行该方法后,外围设备的delegate 将异步接收peripheral(_:didUpdateValueFor:error:) 方法。在该方法中,您可以查询传递的characteristic 参数的valuevalue 将是一个 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,因此可以使用 let 保护。

    通常,特征将在其最多 20 字节的 Data 有效负载中编码一个简单的值。例如。也许这是一个简单的 UInt16 计数器。到

    要在这些 Data glumps 和有意义的数字之间进行转换,请查看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 {}
    

    【讨论】:

    • 感谢您非常详细的回答!我明天看看,试试这个!再次感谢!
    • 在我的情况下 peripheral.setNotifyValue(true, for: features) 工作但没有 didUpdateValueFor..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2017-01-01
    相关资源
    最近更新 更多