如何从 BLE 制造商数据抖动中获取所需值
Posted
技术标签:
【中文标题】如何从 BLE 制造商数据抖动中获取所需值【英文标题】:How to get desired values from BLE manufacturer data flutter 【发布时间】:2020-12-13 19:07:38 【问题描述】:我是 Flutter 的新手,我正在开发一个从 BLE 信标读取数据的应用程序。我已扫描设备并获得制造商数据为256:[0,0,0,16,1,57,33,18,0,0,154,10,0,0,94,0]
设备制造商告诉我设备数据如下:
KCBAdvDataManufacturerData = <.. .. be>
UUID - kCBAdvDataManufacturerData 数据包包含传感器数据,如下所示:
字节索引 8 – 11 = 压力 32 位值
字节索引 12 – 15 = 温度 32 位值
字节索引 16 = 电池电量百分比
我完全不知道在 Dart 中如何实现它
256:[0,0,0,16,1,57,33,18,0,0,154,10,0,0,94,0]
到
字节索引 8 – 11 = 压力 32 位值
字节索引 12 – 15 = 温度 32 位值
字节索引 16 = 电池电量百分比
然后 以人类可以理解的形式 此处温度以 PSI 中的 C 压力为单位,电池以 % 为单位。
【问题讨论】:
【参考方案1】:有一个字节列表,因此您可以使用 https://api.dart.dev/stable/2.9.1/dart-core/List/sublist.html 从该列表中获取子列表
该子列表可以从 4 个字节转换为压力和温度值的有符号整数:
Convert 4 byte into a signed integer
我不确定您获得的索引值是否正确。我假设数据是little endian 格式,所以我对数据的假设是:
压力 = [33,18,0,0] = 4641(您期望的值约为 46.41psi?)
温度 = [154,10,0,0] = 2714(您期望的值约为 27.14c 吗?)
电池 = [94] = 94(您期望的值为 94% 吗?)
这可能会像下面这样完成:
import 'dart:typed_data';
var manufacturerData = Uint8List.fromList([0,0,0,16,1,57,33,18,0,0,154,10,0,0,94,0]);
var pressure = ByteData.sublistView(manufacturerData, 6, 10);
var temperature = ByteData.sublistView(manufacturerData, 10, 14);
var battery = ByteData.sublistView(manufacturerData, 14, 15);
main()
print(pressure.getUint32(0, Endian.little));
print(temperature.getUint32(0, Endian.little));
print(battery.getUint8(0));
给我输出:
4641
2714
94
【讨论】:
谢谢@ukBaz,但我没有办法解码这些子字符串,如何做到这一点 [33,18,0,0] = 4641? @ramashishtomar,您是否点击了指向***.com/questions/13322327/… 的链接? 是的,但没有得到预期的结果,我收到错误方法 'asByteArray' 没有为类型 'Int8List' 定义。 添加我在dart.dev/#try-dart运行的代码示例 @ukBaz 嗨,我有一个类似的问题。我的制造数据看起来像 76:[2, 21, 226, 197, 109, 181, 223, 251, 72, 210, 176, 96, 208, 245, 167, 16, 150, 224, 0, 0, 0 , 4, 232] 14, 15 索引用于电池,但我不知道为什么是 167 和 16。您提供的代码输出返回 167。我可以使用官方应用程序扫描信标,它提供 100% 电池和 3102 毫伏。你能帮我解决这个问题吗?以上是关于如何从 BLE 制造商数据抖动中获取所需值的主要内容,如果未能解决你的问题,请参考以下文章