小程序:ble蓝牙连接与安卓通信数据组包

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
  },

猜你喜欢

转载自blog.csdn.net/fankse/article/details/112533636