BLE中央ArrayBuffer

BLE central ArrayBuffer

将 cordova BLE Central 与 Ionic 结合使用,我正在尝试编写 (withoutResponse)。

根据文档,数据格式是 ArrayBuffer。

通过数据包分析得知写入的值应该是02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D

我的问题是如何使用 JavaScript 创建所需的 ArrayBuffer ?

我试过

Buffer.from("02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D").buffer

但是当我检查交换的数据包时,写入的值是

3032 4644 2031 3630 3020 3030 3030 2030 3030 3020 3030 3245 2031 3438 3120 3146 3846 2037 3530 3020 3030 3030 2030 3034 44

https://nodejs.org/api/buffer.html#buffer_buf_buffer

This ArrayBuffer is not guaranteed to correspond exactly to the original Buffer. See the notes on buf.byteOffset for details.

底层ArrayBuffer中Buffer的数据从.byteOffset

开始

您还为 Buffer.from 读取的十六进制字符串使用了错误的格式,您还需要告诉它使用 'hex' 编码(默认为 'utf-8')。它不理解空格(也不理解 16 位值的概念,这将是 TypedArrays 和 .readInt16BE 以及其他实用函数的工作)。

buf=Buffer.from("02FD160000000000002E14811F8F75000000004D",'hex')
data=buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.length)

我不知道你从哪里得到这些数据,但它看起来像 16 位值。您必须确保数据的字节顺序,以确保不需要交换字节。

使用TypedArray获取ArrayBuffer。这适用于浏览器:

    data = new Uint16Array("02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D"
     .split(' ').map(x=>parseInt(x,16)))
    
    console.log([...data].map(x=>x.toString(16).padStart(4,'0')).join(''))
    
    buf = data.buffer; //ArrayBuffer