0.定义数据
data: { count:1, //0是wifi连接 1是蓝牙连接
wifiList:[],
deviceId:'',
services:'',
writeId:'',
},
1.字符串转buffer封装
writeUTF(str) {
var back = [];
var byteSize = 0;
for (var i = 0; i < str.length; i++) {
var code = str.charCodeAt(i);
if (0x00 <= code && code <= 0x7f) {
byteSize += 1;
back.push(code);
} else if (0x80 <= code && code <= 0x7ff) {
byteSize += 2;
back.push((192 | (31 & (code >> 6))));
back.push((128 | (63 & code)))
} else if ((0x800 <= code && code <= 0xd7ff)
|| (0xe000 <= code && code <= 0xffff)) {
byteSize += 3;
back.push((224 | (15 & (code >> 12))));
back.push((128 | (63 & (code >> 6))));
back.push((128 | (63 & code)))
}
}
for (i = 0; i < back.length; i++) {
back[i] &= 0xff;
}
return back
},
2.数据分包
packenDecoder(msg){
console.log(msg);
let that=this;
let buffer = msg;
let pos = 0;
let offset=13
// let bytes = buffer.byteLength;
//获取buffer字节数
let bytes = buffer.length;
//通过字节大小判断有多少个包
let packSize = Math.ceil((bytes-13)/18)
let arr = [];
//第一包数据传输
arr.push(this.fillBody(0X07,buffer,0,0,0X00))
//分包传输数据
for (let i = 0; i < packSize; i++) {
arr.push(this.fillBody(0X07,buffer,offset,(i==packSize-1)?2:1,i));
offset += 18;
}
arr.forEach(item=>{
//转buffer对象
var bufView = new Uint8Array(item);
var arrayBuffer = bufView.buffer;
this.delay(0.25).then(res=>{
wx.writeBLECharacteristicValue({
deviceId: that.data.deviceId,
// 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
serviceId: that.data.services,
// 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
characteristicId: that.data.writeId,//第二步写入的特征值
value: arrayBuffer,
success(res) {
console.log('第一次发送', res)
},
fail: function (err) {
console.log('写入失败',err)
},
complete:function(){
console.log("调用结束");
}
})
})
})
},
3.分包延时发送
delay(ms, res) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(res);
}, ms);
});
},
4.分包传输
//分包传输
fillBody( cmdId ,data, offset , state , no){
let length=data==null?0: data.length;
let result = [];
if(state == 0){//第一包数据
let bufferSize = length<=13?(7+length):20;
// data = new Uint8Array(bufferSize);
//位运算
result.push(0XA1,cmdId,length&0xFF,length>>8,length>>16,length>>24,no)
//包数据取值
for (let index = 7; index < bufferSize; index++) {
result.push(data[offset++]);
}
}else if(state == 1) {//中间数据
let bufferSize =20;
// result = new Uint8Array(bufferSize);
result.push(0XA2,no);
for (let index = 2; index < bufferSize; index++) {
result.push(data[offset++]);
}
}else if(state == 2) {//最后一包数据
let bufferSize =2+length-offset;
// result = new Uint8Array(bufferSize);
result.push(0XA3,no);
for (let index = 2; index < bufferSize; index++) {
result.push(data[offset++]);
}
}
return result;
},