1. OAD升级原理
oad升级有2个文件,都是bin格式的文件,imagA和imagB,两个镜像文件,为了防止蓝牙升级出错,需要先查询当前蓝牙的镜像类型是哪个,如果是A镜像就用B文件去升级,如果是B镜像就用A去升级。
2. 蓝牙镜像类型和版本查询
查询类型和版本需要使用相关的service和characteristic,下面是我的项目中使用到的,具体是那个还要看自己的情况
BT_OAD_SERVICE
@“F000FFC0-0451-4000-B000-000000000000” //服务
BT_OAD_IMAGE_NOTIFY
@“F000FFC1-0451-4000-B000-000000000000” //查询版本,发送升级通知
BT_OAD_IMAGE_BLOCK_REQUEST
@“F000FFC2-0451-4000-B000-000000000000” //发送升级文件
3. 发送查询镜像版本信息
写入0或1,回复我们01 00 00 7C 42 42 42 42类似这样的信息,一共8个字节(我们后面发的升级通知给蓝牙设备其实也就是发这种形式的信息),这些都是16进制表示。第一个字节01是镜像版本,7C*4其实就是镜像文件的真正大小,42是镜像类型,ASCII码代表的是字母"B",也就是说蓝牙设备现在是镜像B,我们升级的话就要发给他镜像A文件。
4. 发送升级通知
获得了版本号和镜像类型,对比版本后如果可以升级,就先加载升级文件,查询到是镜像B就用A去升级,反之亦然。
要发送的升级通知消息 12个字节
设置要发送的内容,从文件数组下标4开始读取8个字节,如: 01 00 00 7C 42 42 42 42
一定包含这样类型的字节信息,其实就是通知蓝牙设备发送的镜像版本01,大小7C(嵌入式那边7C*4就是文件长度,镜像“B”。剩余四个字节为0,完整例子即为:01 00 00 7C 42 42 42 42 00 00 00 00;
5.发送升级文件
从对应的下载.bin文件读取,每次发送包的大小为18个字节, 前两个字节自定义,为包号,从0开始,低位在前;后16个字节从下载文件中读取,以此发送。每包数据如:00 00 39 48 FF FF 01 00 00 7C 42 42 42 42 00 00 00 00;
NOTIFY:发送成功会返回包号;(本人项目)
6.升级成功
数据传输完成,重新连接判断版本是否更新