云开发存储功能(以蓝牙小程序固件更新为例):
先控制台上传来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循环中加入计数,也可以加进度条。做好能让下位机计算出文件总长,看有没有丢包,从数据交接中可以逐渐调整发送频率。