1.定义参数
data:{
offset: 0,
dataArr: [],
cmd: undefined,
arrLength: undefined,
wifiList: [],
mac: ''
}
2.数据组包
//数据组包
packDecoder(value) {
let offset = this.data.offset;
let data = this.data.dataArr;
let cmd = this.data.cmd;
let len = this.data.arrLength
//转换成Uint8Array 对象
var view = new Uint8Array(value);
//OXA1 A2 A3 与安卓定义好的协议指令
if (view[0] == 0XA1) {
data = []
offset = offset + 1
cmd = view[offset++];
//长度位运算
len = view[offset + 0] | view[offset + 1] << 8 | view[offset + 2] << 16 | view[offset + 3] << 24;
offset += 4;
let no = view[offset++];
if (len > 0) {
//第一包数据
for (let i = offset; i < view.length; i++) {
data.push(view[i])
}
// 第一包13个字节
offset = 13;
this.setData({
offset: offset,
dataArr: data,
cmd: cmd,
arrLength: len
})
} else {
data = null;
offset = 0;
this.setData({
offset: offset,
dataArr: data,
cmd: cmd,
arrLength: len
})
}
//只有一包数据
if (len <= 13) {
this.parser(cmd, data);
}
} else if (view[0] == 0XA2) {
//中间包数据 第二包20个字节
if (data != undefined) {
var no = view[1];
for (let i = 2; i < view.length; i++) {
data.push(view[i])
this.setData({
dataArr: data,
offset: offset + 18
})
}
}
} else if (view[0] == 0XA3) {
//最后一包数据 剩下所有字节
if (data != undefined) {
var no = view[1];
for (let i = 2; i < view.length; i++) {
data.push(view[i])
this.setData({
dataArr: data,
offset: offset + view.length - 2
})
}
this.parser(cmd, data);
}
}
},
3.通过指令执行不同的操作
//处理命令
parser(cmd, data) {
console.log("cmd---", cmd);
switch (cmd) {
case 0x03: //获取wifi list
// this.ab2hex(data)
this.setData({
wifiList: this.ab2hex(data),
offset: 0,
dataArr: [],
cmd: undefined,
arrLength: undefined,
})
this.sendMac()
break;
//通过指令名进行对应的操作
case 0x01:
this.setData({
mac: this.ab2hex(data)
})
break;
4.转换方法
/**
* 将ArrayBuffer转换成字符串
*/
// String.fromCharCode.apply(null, new Uint8Array(buf));
ab2hex(buffer) {
let encodedString = String.fromCodePoint.apply(null, new Uint8Array(buffer));
return encodedString
},