沧海一生笑
沧海一生笑
  • 发布:2021-12-31 19:10
  • 更新:2022-01-01 13:28
  • 阅读:354

帮忙解读下发送BLE信息的代码

分类:HTML5+

BLE的发送代码是这样的,当发送信息是正常文本时,以上代码运行是正常的
var value="This is send string";
str2ArrayBuffer(value, function(buffer){
plus.bluetooth.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: wcharacteristicId,
value: buffer,
success: function(e){
outLine('第一次写入数据成功!'+value);
},
fail: function(e){
outLine('第一次写入数据失败! '+JSON.stringify(e));
}
});
});

function str2ArrayBuffer(s,f) {
    var b = new Blob([s],{type:'text/plain'}); // 试过更换type也不行 var b = new Blob([s],{type:'application/octet-stream'});
    var r = new FileReader();
    r.readAsArrayBuffer(b);
    r.onload = function(){if(f)f.call(null,r.result)}
}

问题出在需要发送一段带控制的 文本,十六进制如下:0x F101018AF4555657580d0a 把字符放在value里面发送,却使用串口助手发现,收到的信息和发送的不符,经过跟踪发现 经过 str2ArrayBuffer函数后 发送的字符串转变为了 c3 b1 01 01 c2 8a c3 b4 55 56 57 58 0d 0a 我猜想像自动进行了 base64编码,文本和数字是不变的,高位控制码例如F1自动转变为了 c3b1 我是不想让他自动转的,希望输入什么信息就发送什么信息, 而接收 带控制码的文本是没有问题的,我猜想是 var b = new Blob([s],{type:'text/plain'}); 这个 MIME type会自动调用编码,但是我改过 type好像没有什么变化, 有哪位高手能解读下,哪里出了问题吗?

2021-12-31 19:10 负责人:无 分享
已邀请:
沧海一生笑

沧海一生笑 (作者)

自问自答一下吧, 重写了以下函数, 数据就正常了
function str2ArrayBuffer(value) {
var buf = new ArrayBuffer(value.length); // 每个字符占用1个字节
var bufView = new Uint8Array(buf);
for (var i=0, strLen=value.length; i<strLen; i++) {
bufView[i] = value.charCodeAt(i);
}
return buf;

估计是 原来的这一句把数据给变了 var b = new Blob([s],{type:'text/plain'});
系统会根据MIME type 定义的程序,自动处理数据,所以自建了 ArrayBuffer的数据结构就正常了
这个 readAsArrayBuffer 函数很冷门, 没想到有这样的坑。

该问题目前已经被锁定, 无法添加新回复