Отсутствует значение RR-интервала (устройство BLE / Polar)

У меня есть устройство Polar H10, и меня интересуют частота сердечных сокращений, а также интервал RR, которые я считываю с помощью официального API-интерфейса Bluetooth с низким энергопотреблением для Android. Каждую секунду устройство Polar отправляет пакет с частотой пульса и интервалом RR. Теперь я понял, что в каждом таком пакете есть значение частоты пульса, но в некоторых пакетах нет значений RR-интервала (значение RR-интервала равно -1).

Почему так происходит? Мое устройство сломано, или я допустил ошибку в реализации, или кто-то еще сталкивается с этой проблемой?

Изменить: вот код. В методе public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) я получаю измененные значения от устройства Polar. Этот метод срабатывает примерно каждую секунду. Затем я разбираю характеристику следующим образом:

    public int[] parse(BluetoothGattCharacteristic characteristic) {

        double heartRate = extractHeartRate(c);
        Integer[] interval = extractBeatToBeatInterval(c);

        int[] result = null;
        if (interval != null) {
            result = new int[interval.length + 1];
        } else {
            result = new int[2];
            result[1] = -1;
        }
        result[0] = (int) heartRate;

        if (interval != null) {
            for (int i = 0; i < interval.length; i++) {
                result[i+1] = interval[i];
            }
        }

        return result;
    }


private static double extractHeartRate(
        BluetoothGattCharacteristic characteristic) {

    int flag = characteristic.getProperties();
    Log.d(TAG, "Heart rate flag: " + flag);
    int format = -1;
    // Heart rate bit number format
    if ((flag & 0x01) != 0) {
        format = BluetoothGattCharacteristic.FORMAT_UINT16;
        Log.d(TAG, "Heart rate format UINT16.");
    } else {
        format = BluetoothGattCharacteristic.FORMAT_UINT8;
        Log.d(TAG, "Heart rate format UINT8.");
    }

    final int heartRate = characteristic.getIntValue(format, 1);
    Log.d(TAG, String.format("Received heart rate: %d", heartRate));
    return heartRate;
}

private static Integer[] extractBeatToBeatInterval(
        BluetoothGattCharacteristic characteristic) {

    int flag = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0);
    int format = -1;
    int energy = -1;
    int offset = 1; // This depends on hear rate value format and if there is energy data
    int rr_count = 0;

    if ((flag & 0x01) != 0) {
        format = BluetoothGattCharacteristic.FORMAT_UINT16;
        Log.d(TAG, "Heart rate format UINT16.");
        offset = 3;
    } else {
        format = BluetoothGattCharacteristic.FORMAT_UINT8;
        Log.d(TAG, "Heart rate format UINT8.");
        offset = 2;
    }
    if ((flag & 0x08) != 0) {
        // calories present
        energy = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, offset);
        offset += 2;
        Log.d(TAG, "Received energy: {}"+ energy);
    }
    if ((flag & 0x16) != 0){
        // RR stuff.
        Log.d(TAG, "RR stuff found at offset: "+ offset);
        Log.d(TAG, "RR length: "+ (characteristic.getValue()).length);
        rr_count = ((characteristic.getValue()).length - offset) / 2;
        Log.d(TAG, "RR length: "+ (characteristic.getValue()).length);
        Log.d(TAG, "rr_count: "+ rr_count);
        if (rr_count > 0) {
            Integer[] mRr_values = new Integer[rr_count];
            for (int i = 0; i < rr_count; i++) {
                mRr_values[i] = characteristic.getIntValue(
                        BluetoothGattCharacteristic.FORMAT_UINT16, offset);
                offset += 2;
                Log.d(TAG, "Received RR: " + mRr_values[i]);
            }
            return mRr_values;
        }
    }
    Log.d(TAG, "No RR data on this update: ");
    return null;
}

Первый элемент, возвращаемый методом синтаксического анализа, - это частота сердечных сокращений, а второй элемент - интервал RR. Бывает, что иногда второй элемент равен -1 (т.е. RR-интервал не обнаружен).


person machinery    schedule 20.06.2017    source источник
comment
Покажи нам код   -  person pablisco    schedule 20.06.2017
comment
@pablisco Я добавил код   -  person machinery    schedule 20.06.2017


Ответы (1)


Нет ничего плохого в вашем устройстве Polar или в опубликованном вами программном обеспечении.

Мера RR-интервала может отсутствовать в некоторых передаваемых пакетах, и в этом случае учитывается if ((flag & 0x16) != 0).

Предположим, например, что ваше устройство отправляет измерение сердечного ритма каждую секунду, и у вас есть 50 ударов в секунду: будут некоторые интервалы, в которых интервал RR не измеряется, потому что в эту секунду не обнаружено сердцебиение (это упрощенное объяснение, просто для того, чтобы вникнуть в суть).

person attdona    schedule 27.11.2017