我正在尝试创建一个读取踏频传感器(Wahoo 健身踏频)的 iOS 应用程序。这是蓝牙特性0x2A5B (CSC Measurement)。在这个例子中,节奏是自行车上踏板的旋转速度。
我在 Swift 中使用以下代码从传感器读取特征: 版本 1:
private func cadence(from characteristic: CBCharacteristic) -> Int {
guard let characteristicData = characteristic.value else {return -1 }
let byteArray = [UInt8](characteristicData)
print(byteArray)
let firstBitValue = byteArray[1] & 0x01 //set bit 1 (not 0)
if firstBitValue == 1 { //IF crank revolution data is present, 1==true
return Int(byteArray[2])
} else {
return 0
}
}
当我打印 byteArray 时,我得到“[2, 1, 0, 152, 11]”。“2”和“0”永远不会改变。“1”位置增加且永不减少。“152”和“11”位置似乎是完全随机的,永远不会变为0。当曲柄完全停止时,它们也不会改变。在阅读文档时,我预计“11”是最后一个事件启动时间。但是,尽管我旋转传感器的速度有多慢,但它似乎并没有改变。
如何使用这些数据从传感器获取节奏?
在 Paul 的帮助下,我对代码进行了更改,结果如下:
版本 2
func cadence(from characteristic:CBCharacteristic, previousRotations:Int = 0) -> (rpm:Double, rotations:Int)? {
guard let characteristicData = characteristic.value else {
return nil
}
let byteArray = [UInt8](characteristicData)
if byteArray[0] & 0x02 == 2 {
// contains cadence data
let rotations = (Int(byteArray[2]) << 8) + Int(byteArray[1])
var deltaRotations = rotations - previousRotations
if deltaRotations < 0 {
deltaRotations += 65535
}
let timeInt = (Int(byteArray[4]) << 8) + Int(byteArray[3])
let timeMins = Double(timeInt) / 1024.0 / 60.0
let rpm = Double(deltaRotations) / timeMins
return (rpm:rpm, rotations: rotations)
}
return nil
}
当前返回的 RPM 低于预期值,大约 53 是最高的,3 是最低的。这些值与传感器开发人员的应用程序进行比较,显示大约 50-70 rpm。
版本 3:
func cadence(from characteristic:CBCharacteristic, previousTime: Int=0, previousRotations:Int = 0) -> (rpm:Double, time: Int, rotations:Int)? {
guard let characteristicData = characteristic.value else {
return nil
}
let byteArray = [UInt8](characteristicData)
if byteArray[0] & 0x02 == 2 {
// contains cadence data
let rotations = Int(byteArray[2])<<8 + Int(byteArray[1])
var deltaRotations = rotations - previousRotations
if deltaRotations < 0 {
deltaRotations += 65535
}
let timeInt = Int(byteArray[4])<<8 + Int(byteArray[3])
var timeDelta = timeInt - previousTime
if (timeDelta < 0) {
timeDelta += 65535
}
let timeMins = Double(timeDelta) / 1024.0 / 60
let rpm = Double(deltaRotations) / timeMins
return (rpm:rpm, time: timeInt, rotations: rotations)
}
return nil
}