【发布时间】:2020-12-24 20:36:45
【问题描述】:
我很难从 HR 特征中获得有效值。我显然没有正确处理 Dart 中的值。
示例数据:
List<int> value = [22, 56, 55, 4, 7, 3];
标志字段: 我将主字节数组中的第一项转换为二进制以获取标志
22 = 10110 (as binary)
这让我相信它是 U16 (bit[0] is == 1)
人力资源价值:
因为它是 16 位,所以我试图获取 1 和 2 索引中的字节。然后我尝试将它们缓冲到 ByteData 中。从那里我将它们转换为 Uint16,并将 Endian 设置为 Little。这给了我一个 14136 的值。显然我错过了一些关于它应该如何工作的基本知识。
任何帮助我清除我不了解的关于如何处理 16 位 BLE 值的内容将不胜感激。
谢谢。
/*
Constructor - constructs the heart rate value from a BLE message
*/
HeartRate(List<int> values) {
var flags = values[0];
var s = flags.toRadixString(2);
List<String> flagsArray = s.split("");
int offset = 0;
//Determine whether it is U16 or not
if (flagsArray[0] == "0") {
//Since it is Uint8 i will only get the first value
var hr = values[1];
print(hr);
} else {
//Since UTF 16 is two bytes I need to combine them
//Create a buffer with the first two bytes after the flags
var buffer = new Uint8List.fromList(values.sublist(1, 3)).buffer;
var hrBuffer = new ByteData.view(buffer);
var hr = hrBuffer.getUint16(0, Endian.little);
print(hr);
}
}
【问题讨论】:
-
此数据长度错误。如果您正在阅读 org.bluetooth.characteristic.heart_rate_measurement,则有效负载的长度应在 2 到 5 个字节之间(除非有 RR,我在这里看不到),具体取决于标志。所以我强烈怀疑你错误地创建了
value。请注意,位是从 LSB 计算的,而不是从 MSB 计算的(因此您正在向后读取它们)。 BLE 也始终是 little-endian,因此如果您确实读取 uint16,则需要将第二个字节移动超过 8 位。但是让我们从获取数据的位置开始,因为它看起来不对。 -
谢谢你 Rob - 我很感激你的回复。有可能我获取的数据不正确(大部分都是新的),但我是从“flutter_blue”示例项目中获取的。这就是我拉特征(0x2A37)时打印到屏幕上的内容。这是另一个更短的(可能更可靠) [22, 56, 55, 4, 7, 3] 鉴于这些位是 LSB,那么这是否意味着在我的示例中 8vs16 位实际上是 0?我将完整列表添加到 OP。如果您还需要什么,请告诉我。
标签: flutter dart bluetooth bluetooth-lowenergy core-bluetooth