云開發(fā)存儲功能(以藍牙小程序固件更新為例):
先控制臺上傳來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
}
})
這里獲得的是在本地上文件的存儲路徑,那么接下來用微信的文件系統(tǒng)讀取,其中,文件路徑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
})
其中,設(shè)置 encoding: 'hex',可以將讀取的數(shù)據(jù)按hex輸出玄叠。也可以默認
動態(tài)地在數(shù)據(jù)庫獲取版本號和對應(yīng)名稱撞牢,因而,在存儲中添加最新版本之后,修改數(shù)據(jù)庫中的最新version字段為最新版本的Id矩动。在代碼中只要獲取最新字段即可。
基于小端模式的藍牙固件更新
以下為小程序默認連接了藍牙释漆,正常收發(fā)信息的情況下悲没。先定義小程序接收方法。Send();
在發(fā)送數(shù)據(jù)之前男图,需要在小程序建立一個緩沖區(qū)ArrayBuffer示姿,在此基礎(chǔ)上,建立一個DataView視圖逊笆,從而能擁有一個二進制對象的底層接口栈戳,以此來接收小程序小端發(fā)送的問題。這里對應(yīng)setUint8,即從起始位置以byte為計數(shù)的指定偏移量(byteOffset)處獲取一個8-bit數(shù)(無符號字節(jié)).示例:
let dataView = new DataView(buffer)
for (let i = 0; i < this.data.inputData.length; i++) {
dataView.setUint8(i, this.data.inputData[i]);
}
比較困難的是难裆,小程序規(guī)定每次藍牙只能傳輸20個字節(jié)子檀,所以需要對Bin文件進行分包,每20字節(jié)分一次包發(fā)送乃戈。你需要先計算出從上面微信getFileSystemManager().readFile的讀取文件出來的buffer數(shù)組bufferArray中褂痰,計算出他字節(jié)長度,每20個字節(jié)為一組發(fā)送症虑。
sumBuffer 這個是Bin文件總長度
for (let i = 0; i < bufferArray.length; i = i + 20) {
arrary = []//臨時存放需要發(fā)送數(shù)據(jù)的數(shù)組
//每20字節(jié)分一次包
for (let y = 0; y < 20; y++) {
if (y + i > sumBuffer - 1) {
break;
}
arrary.push(bufferArray[y + i]);
}
that.sleep(50); //防止下位機接收過快的函數(shù)
that.data.inputData = arrary; //本次分包需要發(fā)送的數(shù)據(jù)
that.Send(); //發(fā)送
j++;
};
你可以在For循環(huán)中加入計數(shù)脐恩,也可以加進度條。做好能讓下位機計算出文件總長侦讨,看有沒有丟包驶冒,從數(shù)據(jù)交接中可以逐漸調(diào)整發(fā)送頻率苟翻。