8

我现在身边有一个Polar h7设备(它是 BTLE),我已经完成了一切工作,但我对如何获得 BPM 感到困惑,characteristic.value因为它正在更新。我必须将一些字节转换为 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 将是 a1或 a 0.. 如果是 a 0,则心率值是 an uint8,如果是 a,1那么它是 a uint16,我可以从中获得 BPM。
如何确定 byte0是 a1还是 a 0?如何将其变成uint8or uint16。如果我这样做了,我是直接得到 BPM 还是必须做其他事情?现在 BPM 以某种<16447d03>有意义的方式回归。

4

2 回答 2

13

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

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

其中,“values”是一个包含实际值的数组。

在我们进行的一次私人讨论中,您将输出列为:

[22, 77, 22, 3] 
[22, 78, 27, 3, 18, 3] 
[22, 79, 2, 3] 
[22, 78, 15, 3] 

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

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

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

这意味着接下来的字节是心率(C1 字段),其余字节是 RR-Interval 值,无论它们是什么(C4 字段)。

所以对于这个数据,心率是 77、78、79、78。

于 2014-08-22T23:22:06.190 回答
1

如果有人想知道如何计算 RR 值。以第一个数组为例:

[22, 77, 22, 3] in binary is 0001 0110  0100 1101  0001 0110 0000 0011

如果我们把它分成一部分,我们有:

Flag (8bit) = 22 or 0001 0110
HRV (8bit) = 77 or 0100 1101
RR (16bit) = 22 & 3 or 0001 0110 0000 0011

因为Bluetooth.org说顺序是 LSO(最低有效八位字节)到 MSO(最高有效八位字节)22 和 3 需要交换离开:

790 or 0000 0011 0001 0110

因为分辨率是1/1024秒。RR 值 = 790/1024 = 0.77s。

于 2016-05-30T04:36:53.090 回答