低功耗蓝牙 GATT 配置文件测量解析值

Posted

技术标签:

【中文标题】低功耗蓝牙 GATT 配置文件测量解析值【英文标题】:Bluetooth Low Energy Glucose GATT profile measurement parsing value 【发布时间】:2017-08-08 12:54:37 【问题描述】:

我想用 Java/android 解析 GATT 特征 org.bluetooth.characteristic.glucose_measurement (0x2A18)。更多细节在这里:https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.glucose_measurement.xml

到目前为止一切正常,从

byte[] values = characteristic.getValue();

然后根据上面的描述我解析了值:

boolean timeOffsetPresent = (values[0] & 0x01) > 0;
boolean typeAndLocationPresent = (values[0] & 0x02) > 0;
String concentrationUnit = (values[0] & 0x04) > 0 ? "mol/L" : "kg/L";
boolean sensorStatusAnnunciationPresent = (values[0] & 0x08) > 0;
boolean contextInfoFollows = (values[0] & 0x10) > 0;

long seqNum = (long) (values[1] & 255);
seqNum |= (long) (values[2] & 255) << 8;

int glucose = values[10] & 255;
glucose |= (values[11] & 255) << 8;

int year = values[3] & 255;
year |= (values[4] & 255) << 8;
byte month = values[5];
byte day = values[6];
byte hour = values[7];
byte min = values[8];
byte sec = values[9];

所有值都是正确的,除了葡萄糖值。我收到了浓度单位=千克/升,因此该值是根据文档中的“葡萄糖浓度 - 千克/升单位”发送的。不幸的是,测试值是

System.out.println("glucose: "+glucose); // equals 28336

28336 完全错误,因为该值应为 110 mg/dl。

任何建议这里有什么问题以及如何解决这个问题?奇怪的是所有其他值都是正确的。

【问题讨论】:

【参考方案1】:

您链接的文档指出浓度是SFLOAT,应该是“IEEE-11073 16 位 SFLOAT”。 This SO post 告诉你如何解码这样的东西。

【讨论】:

感谢您的重要提示!我什至找到了一个使用 Android API 的非常简洁的解决方案:characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_SFLOAT, offset);,其中偏移量表示完整字节数组结果中相关字节的起始位置

以上是关于低功耗蓝牙 GATT 配置文件测量解析值的主要内容,如果未能解决你的问题,请参考以下文章

Android 蓝牙低功耗 Gatt 服务实现错误

在 Android 中为低功耗蓝牙实现 Internet 协议支持配置文件 (IPSP)

在 Android 低功耗蓝牙上读取 GATT 属性的问题

从蓝牙低功耗 GATT 特性中检索大的 32 位无符号整数

Android BLE低功耗蓝牙开发极简系列(二)之读写操作

低功耗蓝牙(BLE)——概念