将 BLE 温度特征值解码为摄氏度

问题描述 投票:0回答:2

我正在使用 BLE 设备读取温度并将其传输到我的系统上,但是 我被困在如何解析从温度特征值返回的编码值上。

例如:我收到来自 BLE 设备的

BmsBAP/aBwECAR8AAA==
响应,我应该将其转换为准确的
36.3 degree Celsius
。 更多读物是:

特性值:

BmsBAP/aBwECAR8AAA==
设备读数:36.3 C

特性值:

BmwBAP/aBwECASEAAA==
设备读数:36.4 C

特性值:

BmYBAP/aBwECAR0AAA==
设备读数:35.8 C

使用BLE设备:FORA IR20红外测温仪

这是我尝试过的代码片段:https://stackblitz.com/edit/node-92jt2g?file=index.ts

因此,需要帮助找出所需温度与设备发送的编码值之间的相关性。

android encoding character-encoding bluetooth-lowenergy arraybuffer
2个回答
0
投票

通过使用 ChatGpt: 也许会有帮助。

您的代码中似乎存在一些问题:

  1. vals
    中的值似乎是Base64编码的字符串,但您的
    base64ToArrayBuffer
    函数正在尝试使用
    atob
    函数,该函数旨在将Base64编码的字符串解码为二进制数据。由于您的值已经经过 Base64 编码,因此您应该使用
    Base64
    解码直接对它们进行解码。这是更正后的
    base64ToArrayBuffer
    函数:
function base64ToArrayBuffer(base64) {
  var binaryString = window.atob(base64);
  var bytes = new Uint8Array(binaryString.length);
  for (var i = 0; i < binaryString.length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  return bytes.buffer;
}
  1. 在尝试使用
    DataView
    提取值的循环中,您正在使用
    getUint8(1)
    ,但根据数据的实际格式,这可能不正确。如果温度表示为浮点数,您可能需要使用
    getFloat32
    getFloat64
    ,具体取决于精度。下面是一个假设温度是 32 位浮点数的示例:
vals.forEach((val) => {
  const bs64ArrBuff = base64ToArrayBuffer(val);
  const view = new DataView(bs64ArrBuff);
  
  // Assuming the temperature is a 32-bit floating-point number (4 bytes)
  const temperature = view.getFloat32(0, true); // true for little-endian, adjust based on your device's endianness
  console.log(val, '==>>', temperature);
});

请根据您的BLE设备使用的实际数据格式调整代码。如果温度以不同方式存储(例如,作为整数或不同的字节位置),您可能需要相应地调整

getUint8
getFloat32
。检查设备文档以了解数据的正确解释。


0
投票

BmYBAP/aBwECAR0AAA==”使用 Base64 进行编码,解码数据的十六进制表示为

  • 0x06 0x66 0x01 0x00 0x07 0x01 0x02 0x01 0x1D 0x00 0x00

你说的是“35.8°C”,并且通常原始数据存储时没有小数,所以它变成了“358”。 第358章

    0x166
正如您所看到的,“1”、“6”和“6”出现在“0x66”和“0x01”的初始字节中,因此您可以像这样读取/重新排序初始字节:

    “0x06”似乎对所有人来说都是一样的,我不知道它可能是什么。也许是测量单位ID
  1. 0x01 + 0x66 = 0x166 即 358 = 35.8°C
如果您对其他人执行相同的程序,您将得到:

  • 06 6C 01 00 07 01 02 01 21 00 00”对于“36.4°C”= 0x01 + 0x6C = 0x16C = 364
  • 06 6B 01 00 07 01 02 01 1F 00 00”对于“36.3°C”= 0x01 + 0x6B = 0x16B = 363
© www.soinside.com 2019 - 2024. All rights reserved.