如何从Swift的蓝牙特性中获取数据

Joh*_*ton 7 bluetooth characteristics ios btle swift

我现在周围有一个Polar h7设备(它是BTLE)而且我已经完成了所有工作,但我很困惑如何获得BPM我们characteristic.value现在正在更新.我必须将一些字节转换为bpm ...

我的外设正在更新:

func peripheral(peripheral: CBPeripheral!, didUpdateValueForCharacteristic characteristic: CBCharacteristic!, error: NSError!) {
    if characteristic.UUID == CBUUID.UUIDWithString(heartRateChar) {
        getInfoAboutHeartRate(characteristic)
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到有关心率的信息:

func getInfoAboutHeartRate(characteristic:CBCharacteristic) {
    println(characteristic.value)
    var bytes = characteristic.value.bytes
}
Run Code Online (Sandbox Code Playgroud)

我知道我需要将这些字节转换为BPM.
根据规格(这是我困惑的地方)在bluetooth.org,字节0要么是a 1还是0..如果是0心率值是a uint8,如果它是a 1那么它是a uint16和我可以从中获得BPM.
如何确定byte 0是a 1还是a 0?如何把它变成一个uint8uint16.如果我这样做,我会直接获得BPM,还是必须为此做其他事情?现在,BPM回归到了<16447d03>有意义的东西.

Gar*_*kin 12

这似乎应该很简单,但试图确认你在说什么."bytes"最终的值是"16447d03"吗?它是指向数据的指针,而不是数据本身,因此您需要执行以下操作来获取实际值:

var data = characteristic.value
var values = [UInt8](count:data.length, repeatedValue:0)
data.getBytes(&values, length:data.length)
Run Code Online (Sandbox Code Playgroud)

在此,"值"是包含实际值的数组.

通过我们的私人讨论,您将输出列为:

[22, 77, 22, 3] 
[22, 78, 27, 3, 18, 3] 
[22, 79, 2, 3] 
[22, 78, 15, 3] 
Run Code Online (Sandbox Code Playgroud)

第一个字节是标志,在您列出的所有情况下都是22.这是有道理的,因为它全部来自相同的心率硬件.

这些位的分组如下:| 保留3位| RR-Interval的1位| 能量消耗状态的1位| 传感器接触状态的2位| 心率值格式的1位| 22是二进制的00010110,它是| 000 | 1 | 0 | 11 | 0 |.

心率值格式位:0(心率值格式设置为UINT8)
传感器触点状态位:3(支持传感器触点功能并检测到触点)
能量消耗状态位:0(不存在能量消耗字段)
RR-间隔位:1(存在一个或多个RR间隔值)

这意味着后面的字节是心率(C1字段),其余字节是RR间隔值,无论它们是什么(C4字段).

因此,对于这些数据,心率为77,78,79,78.