微信小程序BLE蓝牙二进制文件传输

本文详细介绍了在微信小程序中实现从远程服务器下载二进制文件并保存到本地的方法,以及如何读取这些文件(包括BIN和HEX格式),并将其转换为蓝牙发送所需的ArrayBuffer格式。此外,还探讨了文件分包与蓝牙发送过程中的具体实现技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,从远处获取二进制文件,并保存到用户文件

  GetDataFromHttp:function()
  {
    var self=this
    wx.downloadFile({
      url: 'https://www.xxxx.cn/xxx_L_V1.50.bin',
      filePath:`${wx.env.USER_DATA_PATH}/xxx_L_V1.50x.bin`,
      header:{
        'Content-Type':'application/json'
      },
      success:function(res){
        console.log(res.tempFilePath)
        console.log(res.filePath)
        self.setData({
          update_press:res.filePath
       })
        //console.log('res.data',typeof(res.data))
      },
      fail:function(res){
        console.log(res)
      }
    
    })
  }

2,读取用户文件(binary格式和hex格式)

BIN 格式:

read_bin:function()
{
    var self=this
    var rrdata
    var fs = wx.getFileSystemManager()
    fs.readFile({
      filePath:`${wx.env.USER_DATA_PATH}/xxx_L_V1.50x.bin`,
    success: res => {
          //返回文件读取的内容
        //console.log(res)
        //let rdata =res.data  //这里就是读取出来的bin数据arrayBuffer 格式
    }
}

读取hex格式(hex 字符串)

read_str:function()
  {
    var self=this
    var rrdata
    var fs = wx.getFileSystemManager()
    fs.readFile({

      filePath:`${wx.env.USER_DATA_PATH}/xxx_L_V1.50x.bin`,
      //ascii 格式,超过128 的值不对
      //binary: arraybffer 格式,数据正确,怎么取?
      //hex: 以hex字符串形式,1个字节变2个字节。
      //utf8: 超过128 的,变成0xfd
      //不要encoding 默认为 binary格式。
      encoding:'hex',
      success: res => {
          //返回文件读取的内容
        //str 格式,需要hexstr 转arraybuffer
        let rrdata = res.data
        self.setData({
          updata_buff:rrdata,  //string格式的数据放这里
          updata_buff_cnt:0,
          update_press:res.data.length
        })


        var that = this;   
        setTimeout(function(){     
          self.SendBlePkg()
        },1000)

      }
      ,
      fail:  res => {
        console.error
        self.setData({
          update_press:"open file err"
        })
      }
     })

      
  },

3,转换为蓝牙发送需要的ArrayBuffer 格式。(这里花时间最多)

因为要分包,所以一个大个ArrayBuffer 分成多个小包。

尝试过多种方式,均失败

特别是slice,似乎只有从0开始,可以成功。

最后用了如下方法解决:

        //这里的res.data 来自读取文件成功的返回值
        let dataView = new DataView(res.data)

        let len = res.data.byteLength
        let rows= len /148   //这个是我分包的长度
        let cnt = 0
        rows=rows+1
        console.log(len,rows)


        if(rows>0)
        {
          for(let row=0;row<rows;row++ )
          {
            let tmpb= new ArrayBuffer(148)
            let tmpb_dv = new DataView(tmpb)
            let i;
            for(i=0;i<148;i++){
              tmpb_dv.setUint8(i,dataView.getUint8(cnt))
              cnt++
              if(cnt>=len)break
            }
            self.SendBlePkg(tmpb,i)  //发送出去 
            //当然这里似乎不应该这样发,仅仅是举例如何分解成小包
            //最后还是用hex格式来,似乎更方便。
            console.log(ab2hex(tmpb))  //调试用
          }
        }

        }

最后蓝牙发送:(hex 格式的:)

读取成功后调用:(1秒后调用蓝牙发送)

        //str 格式,需要hexstr 转arraybuffer
        let rrdata = res.data
        self.setData({
          updata_buff:rrdata,
          updata_buff_cnt:0,
          update_press:res.data.length
        })


        var that = this;   
        setTimeout(function(){     
          self.SendBlePkg()
        },1000)

sendblepkg函数:

 //发送一包数据
  SendBlePkg:function()
  {
    var self=this
    //console.log(self.data.updata_buff)
    let rows = self.data.updata_buff.length /(148*2)
    rows=rows+1
    let row = self.data.updata_buff_cnt
    self.setData({
        update_press:100*row/rows   //进度展示
     })
    if(row<rows){  //这里判断发送完成,退出的
      let tmpb= self.data.updata_buff.substr(row*148*2,148*2) // new ArrayBuffer(148)
      let tmpb_dv = str2hex(tmpb)
      if(tmpb_dv.byteLength>0)
      {
      wx.writeBLECharacteristicValue({
        deviceId: self._deviceId,
        serviceId: self._serviceId,//  _deviceId,
        characteristicId: self._characteristicId,
        value: tmpb_dv,
        fail: function (res) {
          console.log('write BLEChar fail')
          self.setData({
          update_status:'write BLEChar fail'})
          //break
        },
        success:function (res) {
          console.log(self.data.updata_buff_cnt)
          self.data.updata_buff_cnt++
          setTimeout(function(){    //如果包与包之间不延时,可以直接调用 SendBlePkg
            self.SendBlePkg()
          },100)

        },

      })
         
    }else{
      self.setData({
        update_press:100
     })
    }
     
    }
    else{
      self.setData({
        update_press:100
     })
    }
  },

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值