BLE центральный ArrayBuffer - PullRequest
1 голос
/ 26 мая 2020

Используя Cordova BLE central с Ioni c, я пытаюсь написать (без ответа).

Согласно do c формат данных - ArrayBuffer.

Из анализ пакетов Я знаю, что записанное значение должно быть 02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D

Мой вопрос в том, как создать требуемый ArrayBuffer, используя JavaScript?

Я пробовал с

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

1 Ответ

1 голос
/ 26 мая 2020

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

Не гарантируется, что этот ArrayBuffer точно соответствует исходному буферу. Подробнее см. Примечания к buf.byteOffset.

Данные буфера в базовом ArrayBuffer начинаются с .byteOffset

Вы также используете неправильный формат для шестнадцатеричной строки этого Buffer. from reads, и вам также необходимо указать ему использовать шестнадцатеричную кодировку (по умолчанию - utf-8). Он не понимает пробелы (ни концепцию 16-битных значений, которая была бы задачей TypedArrays, .readInt16BE и других служебных функций).

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

Я не знаю, где вы это взяли data, но похоже на 16-битные значения. Вам нужно будет удостовериться в том, что данные находятся в порядке байтов, чтобы байты не нужно было менять местами.

Получить ArrayBuffer с помощью TypedArray. Это работает в браузере:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...