基于小程序云开发的蓝牙固件更新方案

云开发存储功能(以蓝牙小程序固件更新为例):
先控制台上传来v1.0的更新包,如id为
cloud://test-97c5e1-1257629594/v1.0.bin

则可以使用微信官方的下载文件方法来得到文件的存储路径

wx.cloud.downloadFile({
      fileID: 'cloud://qinyauth-97c5e1.7169-qinyauth-97c5e1- 1257629594/v1.0.bin',
      success: res => {
        filePath = res.tempFilePath;
        // get temp file path
        console.log(res.tempFilePath)
      },
      fail: err => {
        // handle error
      }
    })

这里获得的是在本地上文件的存储路径,那么接下来用微信的文件系统读取,其中,文件路径filePath为上方从云端下载来的String格式的文件路径:

  wx.getFileSystemManager().readFile({
      filePath: filePath,
      // encoding: 'hex',
      success: res => {
       let bufferArray = new Uint8Array(res.data);
        console.log(res.data)
        console.log(typeof res.data)
      },
      fail: console.error
    })

其中,设置 encoding: 'hex',可以将读取的数据按hex输出。也可以默认
动态地在数据库获取版本号和对应名称,因而,在存储中添加最新版本之后,修改数据库中的最新version字段为最新版本的Id。在代码中只要获取最新字段即可。

基于小端模式的蓝牙固件更新

以下为小程序默认连接了蓝牙,正常收发信息的情况下。先定义小程序接收方法。Send();
在发送数据之前,需要在小程序建立一个缓冲区ArrayBuffer,在此基础上,建立一个DataView视图,从而能拥有一个二进制对象的底层接口,以此来接收小程序小端发送的问题。这里对应setUint8,即从起始位置以byte为计数的指定偏移量(byteOffset)处获取一个8-bit数(无符号字节).示例:

let dataView = new DataView(buffer)
   for (let i = 0; i < this.data.inputData.length; i++) {
     dataView.setUint8(i, this.data.inputData[i]);
   }

比较困难的是,小程序规定每次蓝牙只能传输20个字节,所以需要对Bin文件进行分包,每20字节分一次包发送。你需要先计算出从上面微信getFileSystemManager().readFile的读取文件出来的buffer数组bufferArray中,计算出他字节长度,每20个字节为一组发送。

   sumBuffer 这个是Bin文件总长度
   for (let i = 0; i < bufferArray.length; i = i + 20) {       
              arrary = []//临时存放需要发送数据的数组
              //每20字节分一次包
              for (let y = 0; y < 20; y++) {
                if (y + i > sumBuffer - 1) {
                  break;
                }
                arrary.push(bufferArray[y + i]);
              }
              that.sleep(50); //防止下位机接收过快的函数
              that.data.inputData = arrary; //本次分包需要发送的数据
              that.Send(); //发送
              j++;
            };

你可以在For循环中加入计数,也可以加进度条。做好能让下位机计算出文件总长,看有没有丢包,从数据交接中可以逐渐调整发送频率。

你可能感兴趣的:(基于小程序云开发的蓝牙固件更新方案)