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

use*_*747 1 xamarin.android bluetooth-lowenergy

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

\n\n

以下是一些示例读数:

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

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

\n\n

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

\n

小智 6

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

为了获得有用的东西,您必须从原始字节数组中获取相关数据。

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]

第一个字节 (byte[0] = 6) 是位标志:00000110

  • 位 0 是最右边的 = 0,表示温度测量值(以摄氏度为单位)。(如果是 1 华氏度)。

  • 位 1 = 1,表示存在时间戳字段。0如果时间戳字段不存在。

  • 位 2 = 1,表示存在温度类型字段。0如果温度类型字段不存在。

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

  • Bytes[1] (104) 和 [2] (1) 是 FLOAT 形式的温度(以摄氏度 * 10 为单位)。要获得温度,请将 byte[2] 乘以 256 并添加 byte[1],然后将总计除以 10。结果:1 * 256 + 104 = 360。温度为 36.0

  • 字节3和字节4在这里没有任何意义。通常它们是 4 字节温度浮点的一部分。

  • 字节 [5] (226) 和 [6] (7) 是年份,如 INT16:7 * 256 + 226 = 2018。

  • Byte[7] (3) 是月份。0 表示未知,1 = 一月,这里 3 = 三月。

  • Byte[8] (10) 是一月中的第几天,这里是 10。

  • Byte[10] (21) 是小时(午夜过后的小时数),此处为 21。

  • Byte[11] (52) 是分钟,这里是 52。

  • Byte[12] (0) 是第二个,这里是 0。

  • Byte[13] (2) 是温度类型,这里是 Body(一般)。该字节的其他选项有:

1   Armpit
2   Body (general)
3   Ear (usually ear lobe)
4   Finger
5   Gastro-intestinal Tract
6   Mouth
7   Rectum
8   Toe
9   Tympanum (ear drum)
10 - 255    Reserved for future use
0   Reserved for future use```
Run Code Online (Sandbox Code Playgroud)