java - 如何从字节数组中获取正确的温度值
问题描述
我正在尝试创建一个 BLE 应用程序,我想在其中捕获设备的温度值。我正在使用临时保姆设备。
我有这个 UUID=0000ffe1-0000-1000-8000-00805f9b34fb。从这里我得到一个字节数组。
// For all other profiles, writes the data formatted in HEX.
final byte[] data = characteristic.getValue();
if (data != null && data.length > 0) {
final StringBuilder stringBuilder = new
StringBuilder(data.length);
for(byte byteChar : data)
stringBuilder.append(String.format("%02X ", byteChar));
intent.putExtra(EXTRA_DATA, new String(data) + "\n" +
stringBuilder.toString());
}
以下是一些十六进制结果:
AA 06 11 00 3E 0D 00 62 ---
AA 06 11 00 43 0D 00 67 ---
AA 06 11 00 49 0D 00 6D
谁能帮助我如何读取这个数组的确切值?
解决方案
在对 IRULU / 广东 Biolight Meditech Temp Sitter应用程序进行逆向工程后,消息看起来好像具有以下格式:
0 1 2 3 4 5 6 7
+------+------+------+------+------+------+------+------+
|Marker|Length|Type |Subtyp|Low |High |Unused|Chksum|
+------+------+------+------+------+------+------+------+
Example AA 06 11 00 3E 0D 00 62
这些字段是:
- 标记:始终为 0xAA。用于描述消息的标记。消息格式似乎旨在发送消息流。0xAA 表示新消息的开始。
- 长度:有效负载长度,以字节为单位。这是没有标记和没有校验和的长度。
- 类型:消息的类型。0x11 似乎是温度消息。还有一条消息 tpe 0x12 看起来很有趣(尽管我不明白它的目的)。应用程序会忽略其他消息类型。
- 子类型:消息子类型。子类型 0 是温度测量值。亚型 1和2 似乎是高低警告/指标。
- Low:温度值的低字节。
- High:温度值的高字节。
- 未使用:这个字节似乎没有被使用并设置为 0。
- 校验和:有效载荷的校验和。它只是通过添加有效负载的所有字节(以长度开始并以未使用字段结束)来计算的。
温度值以 0.01 度(可能是摄氏度)存储。所以要提取它,你计算:
double temperature = ((message[5] & 0xff) * 256 + (message[4] & 0xff)) * 0.01;
在上述示例中,结果为 33.90 °C。
推荐阅读
- string - 仅对 pyspark 中布局的字符串变量应用修剪
- sql - 基于 postgres 中的重叠间隔对计数进行求和
- php - 无法将数据从网站添加到数据库
- javascript - Redux - 在 React 组件的构造函数中使用 bindActionCreators 有什么缺点吗?
- c++ - 动态变量不起作用
- javascript - 如何使用打字稿和样式组件提升非反应静态?
- php - Laravel (v5.2.45) 播种器和双引号
- javascript - 当用户在 textarea 中点击“输入”时,如何在 MySql 中添加新行?
- android - 麻省理工学院应用程序发明者休息在平板电脑上运行时返回错误
- macos - 如何将终端样式更改回默认值?