Как получить данные из характеристики 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 с.

Другие вопросы по тегам