如何在Swift中将数据从蓝牙特性中提取出来

我现在已经有了一个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要么是10 ..如果它是一个0的心率值是一个uint8 ,如果它是1那么这是一个uint16 ,我可以从中得到BPM。
如何找出字节01还是0 ? 如何把它变成uint8uint16 。 如果我这样做,我能直接获得BPM,还是必须做一些其他的事情? 现在BPM回来了,就像<16447d03>这是有道理的。

这似乎应该很简单,但试图确认你在说什么。 “字节”是否以“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(支持传感器触点function,检测到触点)
能量消耗状态位:0(能量消耗场不存在)
RR间隔位:1(存在一个或多个RR间隔值)

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

所以这个数据的心率是77,78,79,78。

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

 [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。