我现在身边有一个Polar h7设备(它是BTLE),并且一切正常,但是我对如何更新characteristic.value的BPM感到困惑,因为它正在更新。我必须将一些字节转换为bpm ...

我的外围设备正在更新:

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

我正在获取有关心率的信息:
func getInfoAboutHeartRate(characteristic:CBCharacteristic) {
    println(characteristic.value)
    var bytes = characteristic.value.bytes
}

我知道我需要将这些字节转换为BPM。
根据bluetooth.org的规范(这是我感到困惑的地方),字节0要么是1要么是0 ..如果它是0,则心率值是uint8,如果它是1,则它是一个uint16,我可以从中获取BPM。
如何确定0字节是1还是0?如何将其转换为uint8uint16。如果这样做,我会提高BPM还是必须做其他事情?现在,BPM以类似于<16447d03>的形式返回,这很有意义。

最佳答案

似乎应该足够简单,但是要尝试确认您的意思。 “字节”是否以“16447d03”结尾?它是指向数据的指针,而不是数据本身,因此您需要执行以下操作以获取实际值:

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

在这种情况下,“值”是一个包含实际值的数组。

在我们的私有(private)讨论中,您将输出列出为:
[22, 77, 22, 3]
[22, 78, 27, 3, 18, 3]
[22, 79, 2, 3]
[22, 78, 15, 3]

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

这些位按如下方式分组:
| 3位保留| RR间隔为1位| 1位表示能量消耗状态| 2位用于传感器接触状态| 1位用于“心率值格式” |
22是二进制的00010110,即| 000 | 1 | 0 | 11 | 0 |。

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

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

因此,对于此数据,心率分别为77、78、79、78。

10-08 18:17