小程式:ble藍芽連線與安卓通訊資料組包
阿新 • • 發佈:2021-01-13
技術標籤:2021-01
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
},