我正在使用在Xcode上使用Swift的应用程序,该应用程序连接到蓝牙BLE外设。我已经建立了与设备的连接,并想从特定特征(特别是服务UUID
FFF0中的FFF1)读取一些数据。
如果要查找其信息的特征是,我可以使用以下代码请求特征的读取characteristicx
:
peripheral.readValueForCharacteristic(charactericsx)
我想知道的是:如何检查此读取值是否是我要的值。我希望能够执行if语句,以针对该特征的发现值检查我的值。
例如:如果发现的值为X,则执行其他操作;否则,如果发现的值为Y,则执行其他操作。
这不是我要做什么的很好解释,但我希望您能理解。
有人知道该怎么做吗?
为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 {}
我正在尝试使用Android Studio作为IDE和Java作为编程语言与温度计BLE设备进行交互。使用智能手机上的应用程序,我发现了该设备在运行过程中暴露的服务:有很多通用服务/特性和一个自定义服务。 首先,我试着阅读 健康温度计服务(UUID=00001809-0000-1000-8000-00805F9B34FB) 从服务列表中恢复特征并访问其描述符: 在这种情况下,我可以看到测量的结果在
我拥有一个极地H10胸带,它以蓝牙低能量运行,并提供心率和心率变化。 我想用Android应用程序读取这些值。由于官方BLE教程中的帮助,我能够连接到设备。现在的问题是从设备中读取心率和心率变异性值。每次设备上有新值可用时,我都要读取该值(并且至少每秒都有新值)。 我找到了以下代码: 假设我与设备有连接,我如何使用它来提取心率和r-r间隔(节拍到节拍间隔)?如果有人能举个简短的例子,我会很高兴。此
我正在尝试在Sony SmartWatch 3上实现BluetoothGattServer。 我可以成功地打开Gatt服务器并做广告。 使用BLE扫描仪应用程序,我在发现我的自定义服务及其自定义特征时得到不一致的结果。 在三星Galaxy Note 8-Android 4.4-上,我可以正确检测自定义服务和自定义特性 这是我在Wear设备上运行的代码: 我还尝试使用自定义生成的UUID从https
这听起来很基本,但我是Android BLE开发的初学者。到目前为止,我能够创建我的Nexus9设备作为外围设备和Moto G作为中心设备。而且我正在成功连接设备。但我不知道当我从中央设备发送一个特性时,它将从外设接收到哪里?广告回调仅在广告启动成功而不是(在我的例子中是成功的)时才返回 这是我的外设代码 我正在从中央使用连接的Gatt的writeCharacteristic命令,但不知道如何从外
Linux 支持众多的硬件设备,比如:鼠标、打印机、扫描仪、PCMCIA 和 USB 设备。 然而,在安装系统的时候,大部分设备并不需要。 USB 硬件通常工作得很好,只有一些 USB 键盘需要额外地配置(参考 第3.6.4.4节 , "USB BIOS 支持与键盘")。 另外,参考 Linux Hardware Compatibility HOWTO 来判断你的硬件是否被 Linux 支持。
Linux 支持众多的硬件设备,比如:鼠标、打印机、扫描仪、PCMCIA 和 USB 设备。 然而,在安装系统的时候,并不需要其中的大部分设备。