Как получить данные из характеристики Bluetooth в Swift
У меня сейчас есть устройство Polar h7 (это BTLE), и у меня все работает, но я не совсем понимаю, как получить BPM из наших characteristic.value
теперь, когда это обновление. Я должен превратить несколько байтов в бит / мин...
Мое периферийное устройство обновляет:
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>
что имеет смысл.
2 ответа
Кажется, это должно быть достаточно просто, но вы пытаетесь подтвердить, что вы говорите. Означает ли "байты" значение "16447d03"? Это указатель на данные, а не сами данные, поэтому вам нужно сделать что-то вроде этого, чтобы получить фактическое значение:
var data = characteristic.value
var values = [UInt8](count:data.length, repeatedValue:0)
data.getBytes(&values, length:data.length)
Здесь "значения" - это массив, содержащий фактические значения.
Из частного обсуждения, которое мы провели, вы перечислили результат как:
[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 (функция контакта датчика поддерживается и контакт обнаружен)
Бит состояния энергопотребления: 0 (поле "Расход энергии" отсутствует)
Бит интервала RR: 1 (присутствует одно или несколько значений интервала RR)
Это означает, что следующий байт является частотой сердечных сокращений (поле C1), а остальные байты являются значениями интервала RR, какими бы они ни были (поле C4).
Таким образом, для этих данных частота сердечных сокращений была 77, 78, 79, 78.
Если кому-то интересно, как рассчитать значение RR. Взяв первый массив в качестве примера:
[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,77 с.