You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android解析B24 BLE广播包:无法提取公斤重量

解决B24 BLE公斤秤XOR解密提取重量问题

核心XOR解密逻辑

根据B24技术手册第14页说明,使用View PIN 0000进行XOR解密的操作步骤如下:

1. 数据与密钥的字节转换

  • 加密数据:将十六进制字符串(如你提供的DDF1F084)转换为字节数组
  • 解密密钥:PIN 0000对应的十六进制字节数组为0x00, 0x00, 0x00, 0x00(若手册示例中密钥为PIN的ASCII码,则替换为0x30, 0x30, 0x30, 0x30,需结合手册示例验证)

2. 逐字节XOR运算

XOR运算规则:解密字节 = 加密字节 ^ 密钥字节。由于XOR运算可逆:

  • 若密钥为全0字节,解密后的数据与加密数据完全一致
  • 若密钥为ASCII格式的"0000",则需对每个字节单独计算(如0xDD ^ 0x30 = 0xED)

结合设备返回数据的解析步骤

你的设备返回数据示例:

0166786C5FDDF1D260700D0A27
0166786C5FDD0EE73C700D0A27

根据手册第4页的厂商特定数据格式,先提取加密重量段:

  1. 固定协议前缀:0166786C5F
  2. 加密重量数据:第一条数据中的DDF1D260、第二条中的DD0EE73C(对应你提到的DDF1F084为不同重量下的加密值)

Java代码实现解密与重量提取

在你的PruebaConexion18_12_2023Activity中添加以下方法:

// 十六进制字符串转字节数组
private byte[] hexStringToByteArray(String hex) {
    int len = hex.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                             + Character.digit(hex.charAt(i+1), 16));
    }
    return data;
}

// XOR通用解密方法
private byte[] decryptWithXOR(byte[] encryptedData, byte[] key) {
    byte[] decrypted = new byte[encryptedData.length];
    for (int i = 0; i < encryptedData.length; i++) {
        decrypted[i] = (byte) (encryptedData[i] ^ key[i % key.length]);
    }
    return decrypted;
}

// 从解密数据提取公斤值(需结合手册14页的重量格式调整)
private float extractWeight(byte[] decryptedData) {
    // 示例:假设解密后为4字节大端无符号整数,除以100得到带两位小数的公斤值
    int weightRaw = ((decryptedData[0] & 0xFF) << 24) 
                  | ((decryptedData[1] & 0xFF) << 16) 
                  | ((decryptedData[2] & 0xFF) << 8) 
                  | (decryptedData[3] & 0xFF);
    return weightRaw / 100.0f;
}

使用示例

// 从设备返回数据中提取的加密重量段
String encryptedHex = "DDF1F084";
byte[] encryptedBytes = hexStringToByteArray(encryptedHex);

// 密钥:PIN 0000的十六进制字节数组(ASCII格式则替换为new byte[]{0x30,0x30,0x30,0x30})
byte[] key = new byte[]{0x00, 0x00, 0x00, 0x00};

// 执行解密
byte[] decryptedBytes = decryptWithXOR(encryptedBytes, key);

// 提取并打印重量
float weightKg = extractWeight(decryptedBytes);
Log.d("ScaleWeight", "当前重量:" + weightKg + "kg");

验证与调整

  1. 若解密结果不符合预期,优先核对手册第14页示例,确认密钥格式(十六进制/ASCII)
  2. 重量转换逻辑需匹配手册中定义的重量数据格式(如字节顺序、小数位偏移规则)

内容的提问来源于stack exchange,提问作者vLopez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:52:36