如何从 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 制造商数据抖动中获取所需值的主要内容,如果未能解决你的问题,请参考以下文章

android ios 任何 BLE 的任何唯一密钥(我们正在使用所有 BLE - 不依赖制造商)来识别它

iPhone 在其 BLE 制造商数据中的广告是啥?

BLE 扫描记录 - 未获取所有广告数据(服务数据)

在 sqlite 查询中如何获取具有所需值的特定行和列

用javascript读取ble包的制造数据

Magento 2:从数据库中获取产品、Sku 和制造商名称