1. 程式人生 > 其它 >小程式:ble藍芽連線與安卓通訊資料組包

小程式:ble藍芽連線與安卓通訊資料組包

技術標籤: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
  },