如何从Bluetooth LE(SIG)十六进制值提取温度十进制值

时间:2019-02-22 14:14:38

标签: xamarin.android bluetooth-lowenergy

我正在开发一个xamarin android应用程序,以连接到蓝牙低能耗温度计。 我已经可以连接并读取其值。我的问题是它采用十六进制格式,但我还没有找到一种以十进制(摄氏度)格式提取其值的方法。

以下是一些示例读数:

  • 对于36.0摄氏度,我得到06-68-01-00-FF-E2-07-03-0A-15-34-00-02
  • 对于36.2摄氏度,我得到06-6A-01-00-FF-E2-07-03-0A-14-14-00-02
  • 在36.8摄氏度下,我得到了06-70-01-00-FF-E2-07-03-0A-14-1B-00-02
  • 对于34.6摄氏度,我得到06-5A-01-00-FF-E2-07-03-0A-14-1F-00-02

据我了解,它必须是上面2º的“列”(十六进制值68、6A,70、5A)。 10º和11º“列”接缝中的值与测量时间(hh-mm)有关。

我如何提取价值? 我可以使用通用公式吗? 有没有办法知道它的度量单位,以便我可以转换为摄氏度(如果还没有)?

4 个答案:

答案 0 :(得分:1)

“我的问题是它采用十六进制格式”。 我确定您会收到一个字节数组,只是以十六进制格式读取或打印它。

要获得有用的信息,您必须从原始字节数组中获取相关数据。

06-68-01-00-FF-E2-07-03-0A-15-34-00-02是[6,104,1,0,255,226,7,3,10,21,52,0,2]

第一个字节(字节[0] = 6是位标记:00000110。

最右边的位0 = 0,表示温度测量值,以摄氏度为单位。 (如果为1华氏度)。 位1 = 1,表示时间戳字段存在(如果不存在0时间戳字段)。 位2 = 1,表示存在温度类型字段,如果不存在0温度类型字段。

所有其他位都不相关,它们保留以备将来使用。

Bites [1](104)和[2](1)是摄氏* 10的温度,以FLOAT表示。要获得temp乘以256的字节[2]并加上字节[1],将总数除以10。 结果:1 * 256 + 104 =360。温度为36.0

Bites3和4在这里没有意义。通常它们是4字节温度浮动的一部分。

[5](226)和[6](7)是INT16年:7 * 256 + 226 = 2018。

字节[7](3)是月份。 0表示未知,1 = 1月,此处3 = 3月。

Byte [8](10)是一个月的某天,这里是10。

Byte [10](21)是小时(午夜之后的小时数),这里是21。

字节[11](52)是分钟,这里是52。

Byte [12](0)是秒,这里是0。

Byte [13](2)是温度类型,这里是主体(常规)。

1个腋窝
2身(一般)

3个耳朵(通常是耳垂)

4指

5胃肠道

6口

7直肠

8趾

9个鼓膜(耳鼓)

10-255保留以供将来使用

0保留以备将来使用

答案 1 :(得分:0)

温度特性的规格可以在这里找到: https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.temperature_measurement.xml

因此,温度值基本上是一个跨越4个字节的浮点数。

答案 2 :(得分:0)

这些数据来自蓝牙规范,具体取决于您需要使用的服务,在这种情况下,服务就是温度。该信息写在服务规范的xml文件中。请参阅以下温度链接,该链接来自Bluetooth.com

see temperature service here

此链接中还有另一种解释。 See the solution in this link for details

以下链接列出了蓝牙中使用的服务的许多xml文件。我正在添加它以供参考。 many xml services here

答案 3 :(得分:0)

(由于声誉不够,我无法评论 GrooverFromHolland 的回答,所以这是我的回答,至少可以找到一些信息)

补充一点可能很有趣,这个 FLOAT NOT 是一个 32 位单精度浮点数 (https://en.wikipedia.org/wiki/Single-precision_floating-point_format) 但是 IEEE 11073-20601 定义的医疗设备的 32 位浮点数。有关此处的浮点定义,请参阅第 2.2.1 章

https://www.bluetooth.com/wp-content/uploads/2019/03/PHD_Transcoding_WP_v16.pdf

所以基本上你必须这样做:

temperature_float = mantissa * 10 ^ exponent

where
exponent is an 8 bit (signed) int value
mantissa is a 24 bit (signed) int value

所以让我们取包含温度值的字节 1...4(从 0x06-68-01-00-FF-E2-07-03-0A-15-34-00 -02):

"Temperature" bytes 
0x68-01-00-FF

0xFF is the exponent (Bluetooth data comes in LSB first, so you have to flip the bytes)
exponent = 0xFF     (hex)
         = 11111111 (bin)
           ^
           sign bit is set => negative number
         = -1       (int8, two's complement)

mantissa = 0x00-01-68 (again flipped because Bluetooth data comes LSB first)
         = 00000000-00000001-01101000
           ^
           sign bit is not set => positive number
         = 360 (int24, two's complement)

So your temperature will then be 
temperature_float = 360 * (10^-1) = 36.0°C

可以在此处找到更多详细信息 https://www.bluetooth.com/specifications/specs/health-thermometer-service-1-0/ 例如,GrooverFromHolland 很好地描述的标志字节 (0x06 = 00000110) 在 3.1.1.1 ... 3.1.1.4 章节中进行了解释。