Характеристика разбора BLE при разборе iOS блютуз Swift - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь создать приложение для iOS, которое считывает датчик частоты вращения педалей (Wahoo Fitness Cadence).Это характеристика Bluetooth 0x2A5B (измерение CSC) .В этом примере каденция - это скорость вращения педалей на велосипеде.

Я использую приведенный ниже код в 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» будет последним временем запуска.Но, похоже, он не меняется, несмотря на то, как медленно я вращаю сенсор.

Как я могу использовать эти данные для получения частоты вращения сенсора?

После работы с помощью Пола я внес измененияк коду и в конечном итоге в результате ниже:

Версия 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
}

Возвращаемые обороты в настоящее время ниже ожидаемых значений, около 53 является самым высокими 3 является самым низким.Эти значения сравниваются с приложением разработчика датчика, которое показывает около 50-70 об / мин.

Версия 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
        }
...