简体   繁体   English

尝试从 Polar H10 获取心率变异性 [蓝牙低能量样本 UWP]

[英]Trying to get Heart Rate Variability from Polar H10 [Bluetooth Low Energy Sample UWP]

I am working with Polar H10 to get the Heart Rate Variability from it.我正在使用 Polar H10 从中获取心率变异性。

I am running Bluetooth Low Energy Sample from Microsoft.我正在运行 Microsoft 提供的低功耗蓝牙示例

I have used this sample to get the heart rates from another polar device (Polar OH1) and it worked fine.我已使用此示例从另一个极地设备 (Polar OH1) 获取心率,并且运行良好。

But now I want to get the HRV from Polar H10.但现在我想从 Polar H10 获得 HRV。 But BLE sample code is not really showing me the HRV Characteristic which it should just like heart rate.但是 BLE 示例代码并没有真正向我展示它应该像心率一样的 HRV 特性。

These are the only characteristics I am seeing:这些是我看到的唯一特征:

 // first layer keys are serviceUuid's
// second layer keys are characteristicUuid's
// with their respective name/description as values
{
    "1800"    /* Generic Access */                      : {
    "2a00": "Device Name",
    "2a01": "Appearance",
    "2a02": "Peripheral Privacy Flag",
    "2a03": "Reconnection Address",
    "2a04": "Peripheral Preferred Connection Parameters"
},
"1801"    /* Generic Attribute */                   : {
    "2a05": "Service Changed"
},
"180d"    /* Heart Rate */                          : {
    "2a37": "Heart Rate Measurement",
    "2a38": "Body Sensor Location"
   // This is where it should show Heart Rate Variability //
},
"180a"    /* Device Information */                  : {
    "2a23": "System ID",
    "2a24": "Model Number String",
    "2a25": "Serial Number String",
    "2a26": "Firmware Revision String",
    "2a27": "Hardware Revision String",
    "2a28": "Software Revision String",
    "2a29": "Manufacturer Name String"
},
"180f"    /* Battery Service */                     : {
    "2a19": "Battery Level"
},
"6217ff4b-fb31-1140-ad5a-a45545d7ecf3" /* unknown */: {
    "6217ff4c-c8ec-b1fb-1380-3ad986708e2d": "unknown", /* read:true */ // value = 
     uInt16Array [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    "6217ff4d-91bb-91d0-7e2a-7cd3bda8a1f3": "unknown" /* write:true, 
     indicate:true, descriptors:{ descriptorUuid: "2902" }*/
 {
     /* 6172 */
     this service has all the numbers which I have no idea about. 
     Example: 10905, 10906, and etc.  
  }
}

Does anyone know what adjustments should I make to the code so that I can get HRV?有谁知道我应该对代码进行哪些调整才能获得 HRV?

                 **EDIT::** 


           private static ushort ParseHeartRateValue(byte[] data)
    {

        // Heart Rate profile defined flag values
        const byte heartRateValueFormat = 0x01;

        byte flags = data[0];
        bool isHeartRateValueSizeLong = ((flags & heartRateValueFormat) != 0);

        if (isHeartRateValueSizeLong)
        {
            return BitConverter.ToUInt16(data, 1);
        }
        else
        {
            return data[1];
        }
    }

////AFTER UPDATING ABOVE METHOD////// ////更新上述方法后//////

          private static ushort ParseHeartRateValue(byte[] data)
    {
        ushort offset = 1;
        // Heart Rate profile defined flag values
        const byte heartRateValueFormat = 0x01;

        byte flags = data[0];
        bool rr = (flags & (1 << 4)) != 0;
        if (rr)
        {
            int count = (data.Length - offset) / 2;
            for (int i = 0; i < count; i++)
            {

                ushort value = BitConverter.ToUInt16(data, offset);

                double intervalLengthInSeconds = value / 1024.0;
                offset += 2;
            }
        }
        bool isHeartRateValueSizeLong = ((flags & heartRateValueFormat) != 0);

        if (isHeartRateValueSizeLong)
        {
            return BitConverter.ToUInt16(data, 1);
        }
        else 
        {
            return data[1];
        }

    }

The device you use follow the Heart Rate Bluetooth specification.您使用的设备遵循心率蓝牙规范。 So the data it sends should respect this standard.所以它发送的数据应该遵守这个标准。 if you refer to this documentation , you will read the 0x2A37 characteristic, which you listed in your question, but you should not receive it as an int.如果您参考此文档,您将阅读问题中列出的 0x2A37 特征,但不应将其作为整数接收。

The different values given by the characteristic are listed in the documentation I linked.特性给出的不同值列在我链接的文档中。 I think that you will be interested by the 'RR-Interval', which is given with a resolution of 1/1024 second.我认为您会对分辨率为 1/1024 秒的“RR-Interval”感兴趣。

You will need to retrieve the required bytes from your value.您将需要从您的值中检索所需的字节。 Be careful about the byte order.注意字节顺序。 As the documentation states:正如文档所述:

The fields in the above table are in the order of LSO to MSO.上表中的字段按 LSO 到 MSO 的顺序排列。 Where LSO = Least Significant Octet and MSO = Most Significant Octet.其中 LSO = 最低有效八位字节和 MSO = 最高有效八位字节。

So you are looking for the last 2 bytes of the value, since the RR-Interval is an uint16.因此,您正在查找值的最后 2 个字节,因为 RR-Interval 是 uint16。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM