序:由于蓝牙设备产品已经成型,不可能再将产品中的蓝牙设备拆开来拿去烧录升级,所以只能通过小程序蓝牙连接设备再进行OTA升级。
一、设备分两种模式:APP模式,OTA模式;
二、升级的流程(肯定有差别,但是大同小异)
1、一般会先连接目标设备,根据对应服务(一个设备一般会有两个服务通道:server1,server2)获取对应的特征(一个服务一般有两个特征,打印一下就知道了),正常情况下,我们一般会用的一个 server1?和其对应的特征去读写数据、监听数据,那么另一个 server2 和其对应的特征一般就是进入OTA模式读写数据、监听数据的;
2、从APP模式进入OTA模式之前,要根据设备文档来,最好要问设备那边需不需要密码,要的话,输入密码、进入OTA模式的协议也要问明白,肯定是走 server2 写入数据到设备的;
3、要问清进入OTA模式的设备名称是什么,进入OTA模式后,一般会断开连接,可能 设备名称 和 设备的MAC地址 或者 uuid 都会发生改变(看设备那边),重新搜索根据设备名过滤再重新连接上;
4、固件包大致有几种格式:zip、bin、hex,hex16 等等…,这些固件包的格式并不适合小程序使用,所以就需要后端整理数据了,这个是麻烦事,都要用到后端,第一种,包比较小的,可以从后端整理数据后生成一个 xxx.js 的文件(300K之内),第二种,从后端传文件整理后的数据;
5、比如:xxx.hex16 文件下某个数据段,这个并不是蓝牙可需要的数据,标红的是摘取的数据段拼接成一个partition,还要计算长度,根据 run_address 和长度的规则计算出 flash_address,拼接成 一条指令,是在发partition 数据之前;这些都是在后端操作;
:1000C00003B40148019001BD691F000003B4014859
6、然后就是往设备写数据了,整个文件分5个partition,发送partition数据前,计算长度和校验等发送一条指令;发送一段20个字节的数据,一段一段的传,发完16段 监听回应匹配数据,发完一个partition 监听回应匹配数据;发完匹配对应的参数就清楚是哪里,什么时候是完成了;
7、升级完成,设备会断开连接或需要重新启动;如果过程中升级失败,设备会回到升级前版本并退出升级模式或会停留在OTA模式,这个看设备那边怎么定的;
例子:在 wx.onBluetoothDeviceFound() 这里获取对应的设备数据 判断是否升级 (获取当前的 MAC +1 与进入ota模式的 MAC 是否匹配,判断是否进入ota模式,可要可不要)
scanDevices() {
let that = this;
const data = {};
wx.onBluetoothDeviceFound((res) => {
res.devices.forEach(device => {
if (!device.name && !device.localName) { return; } // 过滤命名为空的数据
// 设备过滤
if(device.name.indexOf("XXXX") != -1){
let values = new Uint8Array(device.advertisData);
// values[num] 要与设备的软件工程师沟通
if(values[12] != 1){
var otaMacArray = new Uint8Array(6); // 进入OTA模式时,目标MAC地址+1
for(var i = 0; i < 6; i++){
otaMacArray[i] = values[i+2];
if(i==5){
otaMacArray[i] = (values[i+2]+1)%256;
}
}
app.globalData.otaModelMac = otaMacArray; // 存放到去全局
that.setData({
deviceNeedOTA: true, // 需要升级
})
}else{
app.globalData.otaModelMac = "";
that.setData({
deviceNeedOTA: false, // 不需要升级
})
}
const foundDevices = this.data.deviceList;
const idx = inArray(foundDevices, 'deviceId', device.deviceId);
if (idx === -1) {
data[`deviceList[${foundDevices.length}]`] = device
} else {
data[`deviceList[${idx}]`] = device
}
that.setData(data);
}
})
})
}
function inArray(arr, key, val) {
for (let i = 0; i < arr.length; i++) {
if (arr[i][key] === val) {
return i;
}
}
return -1;
}
|