我正在开发一个xamarin android应用程序,以连接到蓝牙低能耗温度计。 我已经可以连接并读取其值。我的问题是它采用十六进制格式,但我还没有找到一种以十进制(摄氏度)格式提取其值的方法。
以下是一些示例读数:
据我了解,它必须是上面2º的“列”(十六进制值68、6A,70、5A)。 10º和11º“列”接缝中的值与测量时间(hh-mm)有关。
我如何提取价值? 我可以使用通用公式吗? 有没有办法知道它的度量单位,以便我可以转换为摄氏度(如果还没有)?
答案 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 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 章节中进行了解释。