ios - 读取 BLE 外设特性并检查其值?

标签 ios swift bluetooth core-bluetooth

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

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

peripheral.readValueForCharacteristic(charactericsx)

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

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

对于我想做的事情,这不是一个很好的解释,但我希望你能理解要点。

有人知道怎么做吗?

最佳答案

针对 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 guard 是可行的方法。

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

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

关于ios - 读取 BLE 外设特性并检查其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32894363/

相关文章:

iOS 无需用户干预即可打开/关闭 GPS

ios - 在 Unity iOS 上打开设置应用程序

ios - 如何在iOS中同时保留蓝牙键盘和虚拟键盘

xcode - 在基本 block 的中间发现终止符

xcode - 将多个 socket 连接到单一操作?

java - 使用 android 应用程序扫描范围内的蓝牙设备

java - Android BluetoothSocket 输出流写入速度太慢

iOS/iPhone - 显示 UIActivityViewController 时隐藏状态栏

ios - UICollectionView 中的自动布局约束发生变化

ios - 如何在 UITextView URL 中允许表情符号