java - 如何从字节数组中获取正确的温度值

标签 java android bluetooth-lowenergy

我正在尝试创建一个 BLE 应用程序,我想在其中捕获设备的温度值。我正在使用 Temp Sitter 设备。

我有这个 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/Guangdong 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。
  • Checksum:负载的校验和。它是通过将有效负载的所有字节相加(以 length 开始并以 unused 字段结束)简单计算得出的。

温度值以 0.01 度(可能是摄氏度)存储。因此,要提取它,您需要计算:

double temperature = ((message[5] & 0xff) * 256 + (message[4] & 0xff)) * 0.01;

在上面的示例中,结果将为 33.90 °C。

关于java - 如何从字节数组中获取正确的温度值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55470471/

相关文章:

java - 如何避免 BroadcastReceiver 泄漏

Java 控制流图库

java - 在javafx Listview中隐藏垂直滚动条

android - 无法在 AndroidStudio 2.1 Beta 中从 GitHub 克隆

java - 密码验证不允许在屏幕末尾出现特殊字符

android - 如何在运行时更新 Android BLE Advertiser 服务数据?

java - 如何在Java中设置文件的下一个编码

c# - 如何从 C# 代码获取屏幕大小到 XAML?

iOS Core蓝牙无法通过特性传输数据

iOS:信标检测需要很长时间