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

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

猜你喜欢

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