BluetoothHeartRate7

작성일

심박수 측정

드디어 심박수를 측정해 보겠다.

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error _: Error?) {
    guard let characteristics = service.characteristics else { return }

    for characteristic in characteristics {
        if characteristic.properties.contains(.read) {
            /// 심박계 위치 정보 읽기
            print("\(characteristic.uuid): properties contains .read")
            peripheral.readValue(for: characteristic)

        }
        if characteristic.properties.contains(.notify) {
            /// 심박수가 측정 될때마다 알람
            print("\(characteristic.uuid): properties contains .notify")
            peripheral.setNotifyValue(true, for: characteristic)

        }

    }
}

이렇게

peripheral.setNotifyValue(true, for: characteristic)

를 추가했더니

Unhandled Characteristic UUID: 2A37

이런 로그가 찍히는데 이건

Untitled 또 문서를 봐야한다…

첫번째 바이트에는 여러개가 포함되어 있고,

첫번째 비트가 심박수 측정이 8비트인지, 16비트 인지 값을 나타내는 것이다.

첫번쨰 비트가 만약 0이면, 심박수 값 형식은 UINT8이고 즉, 8비트이고

첫번쨰 비트가 만약 1이면, 심박수 값 형식은 UINT16, 즉 16비트 란다.

우리가 원하는 심박수는 두번쨰 바이트 또는 세번째 바이트부터 찾을 수 있다고 한다.

제목이 Requires 인 맨 마지막 열에는 비트 값이 0 일 때 C1 , 비트 값이 1 일 때 C2 가 표시가 된다고한다. Untitled 잘 모르겠고 코드로 보면

private func heartRate(from characteristic: CBCharacteristic) -> Int {
    guard let characteristicData = characteristic.value else { return -1 }
    let byteArray = [UInt8](characteristicData)
    let firstBitValue = byteArray[0] & 0x01
    if firstBitValue == 0 {
        return Int(byteArray[1])
    } else {
        return (Int(byteArray[1]) << 8) + Int(byteArray[2])
    }
}

이렇게 추가하면 된다.
자세한 예제는 https://github.com/choijaegwon/BluetoothHeartRate
를 참고하면 된다.