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
})
}
},