我正在使用 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
因此,需要帮助找出所需温度与设备发送的编码值之间的相关性。
通过使用 ChatGpt: 也许会有帮助。
您的代码中似乎存在一些问题:
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;
}
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
。检查设备文档以了解数据的正确解释。
“BmYBAP/aBwECAR0AAA==”使用 Base64 进行编码,解码数据的十六进制表示为
你说的是“35.8°C”,并且通常原始数据存储时没有小数,所以它变成了“358”。 第358章