wx.writeBLECharacteristicValue({
deviceId: deviceId,//IOS中为DeviceId,Android中为Mac地址
serviceId: serviceId,//服务ID,这里针对的是只进行升级时候的端口,如F000FFC0-XXX
characteristicId: characterId,//特性ID,针对升级获取设备Version的端口,如F000FFC1-XXX
value: buffer,//发送的数据,硬件要求发送的是什么就发送什么转换为buffer类型
success: function (res) {
console.log('发送成功', res) //在这里获取到现在版本的信息,提前与硬件沟通好,如何获取
},
fail: function (err) {
console.log('发送失败:', err, 'code' + err.errCode)
},
complete: function (complete) {}
})
bin文件即可以进行升级的文件,可以通过后台接口请求
1. 解析bin文件,获取到bin文件里面的内容
2. var pathArrayBuffer = wx.getFileSystemManager().readFileSync(tempFilePath,/** 不填默认为ArrayBuffer类型 */);//tempFilePath为请求到的路径
3. var buf = new Uint8Array(pathArrayBuffer);
let nVersion = [buf[x], buf[x], buf[x], buf[x]];//buf[x]为十进制,buf[X]根据情况自己填写
let oVersion = [unit.hexChangeToTen(data.substr(x, y)), unit.hexChangeToTen(data.substr(x, y)), unit.hexChangeToTen(data.substr(x, y)),unit.hexChangeToTen(data.substr(x, y))]; //data为第一步中获取到的设备version信息,根据您情况获取,如data.substr(0, 2));
var startTransfer = false;
if (oVersion[x] != nVersion[x] || oVersion[y] != oVersion[y]) {
if (oVersion[z] == nVersion[z] && oVersion[r] == oVersion[r]) {
//可以进行升级,判断条件根据产品硬件设定,这里只是参考的一种
startTransfer = true;
}
}
if (startTransfer) {
console.log(''进行升级)
}
else{
console.log('最新版本,无需升级')
}
① 第一次发送的数据
//根据要求,需要先进行验证数据,如版本号,储存器版本号,数据大小、长度等,这里16进制字符串
var lenStr = (buf.length / 4).toString(16);
let array = ['xx', 'xx', 'xx', 'xx', nVersion[x].toString(16), nVersion[x].toString(16), lenStr.substr(x, y), lenStr.substr(x, y), 'xx', 'xx', 'xx', 'xx', 'xx', 'xx', nVersion[x].toString(16), nVersion[x].toString(16)];
var bufferStr = '';
for (let i = 0; i < array.length; i++) {
bufferStr = bufferStr + array[i]
}
var buffer = unit.string2ArrayBuffer(bufferStr);//16进制字符串转换为ArrayBuffer格式
wx.writeBLECharacteristicValue({
deviceId: deviceId,//IOS中为DeviceId,Android中为Mac地址
serviceId: serviceId,//服务ID,如F000FFC0-XXX
characteristicId: characterId,//特性ID,如F000FFC1-XXX,特别注意这里是FFC1
value: buffer,//发送的数据,硬件要求发送的是什么就发送什么转换为buffer类型
success: function (res) {
console.log('发送成功', res)
//开始发送bin文件数据,到②
},
fail: function (err) {
console.log('发送失败:', err, 'code' + err.errCode)
},
complete: function (complete) {}
})
② 发送bin文件的数据
var inter = setInterval(function(){
var byte = new Array();
for(let i = 0; i < 18; i++){
if(i <= 1){
byte[0] = parseInt(x%256);
byte[1] = parseInt(x/256);//特别注意,int类型,float类型会得到x.yy,'.'也算是一个字符
}
else{
if(i-2 + x*16 < that.data.oadData.length){
byte[i] = that.data.oadData[i-2 + x*16]
}
else{
byte[i] = 0xFF;
}
}
}
var bufferStr = '';
for(let i = 0; i < byte.length; i++){
var value = byte[i].toString(16);
if(value.length == 1){
value = '0'+value;//特别强调,如果是0,必须变成00
}
bufferStr = bufferStr + value;
}
var buffer = unit.string2ArrayBuffer(bufferStr);//16进制字符串转换为ArrayBuffer格式
wx.writeBLECharacteristicValue({
deviceId: deviceId,//IOS中为DeviceId,Android中为Mac地址
serviceId: serviceId,//服务ID,如F000FFC0-XXX
characteristicId: characterId,//特性ID,如F000FFC2-XXX,特别注意这里是FFC2
value: buffer,//发送的数据,硬件要求发送的是什么就发送什么转换为buffer类型
success: function (res) {
console.log('发送成功', res)
},
fail: function (err) {
console.log('发送失败:', err, 'code' + err.errCode)
},
complete: function (complete) {}
})
x++;
if(x*16 >= that.data.oadData.length){
console.log('升级结束')
wx.hideLoading()
clearInterval(inter)
that.data.isUpdate = false;
x = 0;
wx.showToast({
title: '升级成功',
complete:function(){
wx.navigateBack({
complete: (res) => {},
})
}
})
}
},70)
注意事项
/** 16进制字符串转ArrayBuffer */
function hexString2ArrayBuffer(hexStr) {
var count = hexStr.length / 2;
let buffer = new ArrayBuffer(count);
let dataView = new DataView(buffer);
for (var i = 0; i < count; i++) {
var curCharCode = parseInt(hexStr.substr(i * 2, 2), 16);
dataView.setUint8(i, curCharCode);
}
return buffer;
}
/** 16进制转换为10进制 */
function hexChangeToTen(buffer) {
var tenStr = '0';
for (var i = buffer.length - 1; i >= 0; i--) {
let str = parseInt(buffer.substr(i, 1)) * Math.pow(16, buffer.length - i - 1);
tenStr = parseInt(tenStr) + str;
}
return tenStr;
}