我现在身边有一个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
?如何将其转换为uint8
或uint16
。如果这样做,我会提高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。