RT,最近在研究蓝牙硬件,通过 Chrome 的 WEB 蓝牙接口实现蓝牙硬件控制的功能,在实现的过程中遇到一个问题, 我们的蓝牙通讯协议上面的命令都是 16 进制的比如: 打开 LED 灯,命令是"0x20",关闭 LED 是 :“0x21”,通过 web API 接口连接成功后,随便传了一个 str 的命令过去,结果就返回错误信息:
'writeValue' on 'BluetoothRemoteGATTCharacteristic': The provided value is not of type '(ArrayBuffer or ArrayBufferView)
就是说这个接口只支持传递 ArrayBuffer 的数据,但是我如何将“0x20”这样的 16 进制命令转换成 ArrayBuffer 呢? 我试了几次,发现 ArrayBuffer 内的数据始终是 10 进制的,只能来 V2 求大神指点一二了
1
ideacco OP 之前在 nodejs 上,有一个 Buffer.from 的命令,可以直接将 16 进制传到硬件,在原生 js 上有点蒙了。。。
|
2
rekulas 2020-12-02 20:35:13 +08:00
你用的什么转 new ArrayBuffer(0x20) 试过吗
|
3
rekulas 2020-12-02 20:36:22 +08:00
如果各种方法都不行我怀疑可能和你的传输数据 encode 方法有关
|
4
aloxaf 2020-12-02 20:45:12 +08:00
虽然我不会 JS,但我感觉你应该是搞错了什么……
前几天在一个 Python 群也看到有人问了类似的问题。 你要知道进制是给人看的,而对于人来说 10 进制是最自然的,所以不管你存进去的是什么,最终都会以十进制展示。 |
5
across 2020-12-02 20:45:39 +08:00
假设命令是 8 位长度的,这样么?
const CMD_BTYE_LENGTH = 8; const buffer = new ArrayBuffer(CMD_BTYE_LENGTH); const cmd = new DataView(buffer, 0, CMD_BTYE_LENGTH); cmd.setInt8(0, 0x21); console.log(cmd.getInt8(0)); |
6
ccworker 2020-12-02 20:47:28 +08:00
new Uint8Array([0x21])
|
7
ccworker 2020-12-02 20:48:51 +08:00
var a = new Uint8Array([0x21])
a.buffer |
8
ideacco OP @ccworker 感谢回复,a.buffer 打印出来是 33,也就是说变成了 10 进制的了,我想着是 比如 “5A20”,ArrayBuffer 打印出来应该是 [5a,20]
|
11
aloxaf 2020-12-02 21:18:21 +08:00
|
12
ideacco OP @aloxaf 感谢兄弟的回复,我知道在 js 里面 0x20 就是 32 了,可是我这边的 API 要求使用 ArrayBuffer 类型,但是这个类型你 使用 new Uint8Array([0x20]) 结果是它会传给硬件 32,而硬件支持 10 进制的啊.
|
14
lscho 2020-12-02 21:49:35 +08:00
我觉得你应该从传输数据来检查。。。传递 ArrayBuffer 应该需要修改一下传输数据的类型才行,不能用 string 类型
|
16
yggd 2020-12-02 22:24:40 +08:00
|
17
ysc3839 2020-12-02 22:26:01 +08:00 via Android 1
个人怀疑你没搞懂计算机处理数据的方式。
计算机里面存的都是二进制数据,没有十进制或十六进制。 你说的“十进制”、“十六进制”是程序为了方便用户阅读,把二进制数据转换成十进制或十六进制的字符串,再显示出来。 个人建议你提供这个硬件的文档或者示例代码,目前的信息太少,无法知道具体该如何解决。 |