2017-08-08 78 views
0

我想用Java/Android解析GATT特性org.bluetooth.characteristic.glucose_measurement(0x2A18)。更多细节在这里:https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.glucose_measurement.xml蓝牙低能量葡萄糖GATT配置文件测量解析值

所有的工作,到目前为止,从

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]; 

所有值是正确的,除了血糖值。我接受浓度单位= kg/L,因此根据文档中的“葡萄糖浓度 - 单位为kg/L”发送该值。不幸的是,测试值是

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

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

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

回答

2

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

+1

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