[英]Trying to get Heart Rate Variability from Polar H10 [Bluetooth Low Energy Sample UWP]
我正在使用 Polar H10 从中获取心率变异性。
我正在运行 Microsoft 提供的低功耗蓝牙示例。
我已使用此示例从另一个极地设备 (Polar OH1) 获取心率,并且运行良好。
但现在我想从 Polar H10 获得 HRV。 但是 BLE 示例代码并没有真正向我展示它应该像心率一样的 HRV 特性。
这些是我看到的唯一特征:
// 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.
}
}
有谁知道我应该对代码进行哪些调整才能获得 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];
}
}
////更新上述方法后//////
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];
}
}
您使用的设备遵循心率蓝牙规范。 所以它发送的数据应该遵守这个标准。 如果您参考此文档,您将阅读问题中列出的 0x2A37 特征,但不应将其作为整数接收。
特性给出的不同值列在我链接的文档中。 我认为您会对分辨率为 1/1024 秒的“RR-Interval”感兴趣。
您将需要从您的值中检索所需的字节。 注意字节顺序。 正如文档所述:
上表中的字段按 LSO 到 MSO 的顺序排列。 其中 LSO = 最低有效八位字节和 MSO = 最高有效八位字节。
因此,您正在查找值的最后 2 个字节,因为 RR-Interval 是 uint16。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.