本文讲述盛芯微公司的蓝牙芯片进行升级OTA操作

一、简介

SYD8801 设备端使用 A、B 区的方式储存代码,即当前程序是在存储在 A 区,OTA 将新程序写入 B 区,然后重启系统,程序从 B 区开始执行,故中途断开连接或者中断 OTA 不会造成设备“变砖”。A、B 区随着 OTA 的次数相互切换。

二、OTA 升级需要条件

1、设备端实现 OTA 接收协议
2、APP 端实现了 OTA 的发送协议
3、设备端蓝牙的 Profile 含有服务 0xFF00,和该服务下有一个可读写的特性 0xFF01

三、OTA 过程

1.发送擦除命令
2.计算总包的CRC
3.ota bin文件按5120字节拆分成若干段,每段按20字节拆分成若干包。
先发送当前段的CRC校验数据,然后循环发送当前段的数据
4.最后发送升级指令

具体算法思路

1.读取bin文件转成二进制流 byte[]

2.计算出这个二进制流的CRC码 算法如下 其中ReadData为二进制字节流数组

for(i=0;i<ReadData.length;i++)
{int CC = ReadData[i];CC &= 0x000000FF;CRC += CC;CRC = CRC & 0x0000FFFF;
}

3.发送擦除指令

byte [] WriteData = new byte[2];
WriteData[0] = 0x16;
WriteData[1] = 0x00;

4.收到写入成功 计算总包数 总长度/每包大小 有余数多加一包
SendPacketAllNum = ReadData.length/MAX_TRANS_COUNT_V30 //MAX_TRANS_COUNT_V30为20 即每包大小是20字节

  if (ReadData.length % MAX_TRANS_COUNT_V30 != 0)SendPacketAllNum += 1;

5.计算出每段的CRC SECTION_CRC 算法如下 CRC就是将要发送包段的每个字节相与0x000000FF计算再求和
不是最后一包 其中SendSectionID为当前发送的段序号

for(int i=0;i<20;i++)
{
int CC = ReadData[SendSectionID*20+i];
CC &= 0x000000FF;
SECTION_CRC += CC;
}

最后一包 比如最后一包10字节

for(int i=0;i<10;i++)
{int CC = ReadData[SendSectionID*MAX_TRANS_SECTIONALL_COUNT+i];CC &= 0x000000FF;SECTION_CRC += CC;
}

6.按段落发包Demo限定5120为一段,每发完一段去读取设备的校验和,成功继续发送下一段,失败重发当前段,读这个步骤可以省略

整体代码思路
发送完擦写包后 延迟3秒开始写入 每段数据最大 5120/20 = 256包

7.发送每段数据之前先发送当前段的校验和CRC check 为当前段的CRC size为当前段的大小 SendSectionID为当前包段序号

    byte[] WriteData = new byte[10];int Address = SendSectionID * 5120;WriteData[0] = CMD_FW_WRITE_START;WriteData[1] = 0x13;WriteData[2] = (byte) (Address & 0x000000FF);WriteData[3] = (byte) ((Address & 0x0000FF00) >> 8);WriteData[4] = (byte) ((Address & 0x00FF0000) >> 16);WriteData[5] = (byte) ((Address & 0xFF000000) >> 24);WriteData[6] = (byte) (size & 0x000000FF);WriteData[7] = (byte) ((size & 0x0000FF00) >> 8);WriteData[8] = (byte) (check & 0x000000FF);WriteData[9] = (byte) ((check & 0x0000FF00) >> 8);

发完段序号开始循环发送该段中的包 每包20字节 256个包完成后 去读取设备的校验和 如果设备读出的校验和不等于当前包段的校验和重发当前包
int check = ((data[7] & 0xff) << 8) | (data[6] & 0xff);

       //error check and resendif ((check & 0x0000ffff) != (SECTION_CRC & 0x0000ffff)) {SendSectionID -= 1; //段序号-1SendPacketID = MAX_TRANS_SECTIONALL_PACKET_COUNT * SendSectionID; //重置当前发送的包位置}

8.直到所有包段都发送完成 发送结束包

    byte[] WriteData = new byte[8];WriteData[0] = 0x15;WriteData[1] = 0x04;WriteData[2] = (byte) (Size & 0x000000FF);WriteData[3] = (byte) ((Size & 0x0000FF00) >> 8);WriteData[4] = (byte) ((Size & 0x00FF0000) >> 16);WriteData[5] = (byte) ((Size & 0xFF000000) >> 24);WriteData[6] = (byte) (CRC & 0x000000FF);WriteData[7] = (byte) ((CRC & 0x0000FF00) >> 8);

附上demo
demo演示了搜索蓝牙设备,连接蓝牙设备 用的第三方库

 implementation 'com.clj.fastble:FastBleLib:2.3.4'

读者关注V30TestActivity里面的实现即可扫描蓝牙部分根据实际过滤

 BleManager.getInstance().scan(new BleScanCallback() {@Overridepublic void onScanFinished(List<BleDevice> scanResultList) {addLog("搜索完成...");for (BleDevice bleDevice : scanResultList) {if (!TextUtils.isEmpty(bleDevice.getName()) && (bleDevice.getName().startsWith("BAT001") || bleDevice.getName().startsWith("mtm"))) {Map<String, String> listem = new HashMap<String, String>();listem.put("name", bleDevice.getName());listem.put("mac", bleDevice.getMac());deviceList.add(listem);resultBle.add(bleDevice);}}myBleDeviceAdapter.notifyDataSetChanged();}@Overridepublic void onScanStarted(boolean success) {addLog("扫描中...");deviceList.clear();resultBle.clear();}@Overridepublic void onScanning(BleDevice bleDevice) {}});

最后附上demo连接
https://gitee.com/FIUI/SYD_OTA

不懂得联系我

SYDTEK OTA 蓝牙升级功能实现 附带Demo相关推荐

  1. 安信可蓝牙模块TB系列实现远程OTA无线升级功能介绍,剖析整个实现原理和代码介绍。

    文章目录 一.BLE FOTA简介 二.BLE SLAVE FOTA实现流程 通过手机APP 完成BLE设备的OTA演示 联系我们 一.BLE FOTA简介 BLE SLAVE设备除了有线升级(比如串 ...

  2. 安信可PB-01/02蓝牙模组实现远程OTA无线升级功能介绍,剖析整个实现原理和代码介绍。

    文章目录 一.安信可PB-01/02蓝牙模组 OTA简介 二.安信可PB-01/02蓝牙模组 FOTA实现流程 三.通过手机APP 完成安信可PB-01/02蓝牙模组的OTA演示 联系我们 一.安信可 ...

  3. Android蓝牙打印机功能开发完整Demo

    蓝牙便携式打印机的种类繁多,支持的打印格式也不尽相同.按照指令集可划分为:ESC指令集.CPCL指令集,实现原理基本相同,我这里以佳博便携式打印机为例,进行蓝牙搜索配对并发送打印数据. 完整代码地址在 ...

  4. 乐鑫esp8266学习rtos3.0笔记第6篇:esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网之上增加dns域名解析!(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  5. 蓝牙PHY6222添加OTA升级功能

    主要步骤: 1:代码添加 ota_app_service 2:keil软件添加ota_app代码 3:烧录软件添加ota设置 4:手机ota_app升级 准备: 奉加微电子官网下载6222的代码SDK ...

  6. OTA在线升级Android7.1系统迅为IMX6Q开发板支持SATA,PCIE,EIM总线,WIFI蓝牙

    iTOP-IMX6 开发平台是基于 NXP 的 IMX6 系列芯片开发的产品,该产品广泛应用于车载系统.数字标牌.金融设备.人机界面.机上娱乐系统.工业控制.医疗设备.仪器仪表.智慧城市.商业电子等多 ...

  7. OTA升级功能系列三(MD5加密)

    前言 在前面的两个章节中,我们简单介绍了在OTA升级过程中,如何对文件进行解压缩和加解密的操作.今天,就讲讲这个系列最后的内容,MD5加密. 一.MD5加密是什么? MD5加密,是一种开源的加密算法. ...

  8. Esp8266 进阶之路25【高级篇】深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  9. QCC512x QCC302x GAIA OTA DFU 升级(earbud)

    QCC512x QCC302x GAIA OTA DFU 升级(earbud) 1.不能 DFU 升级的 filesystems: Read-Write (RW) FileSystem Device ...

最新文章

  1. php pdo连接不成功,php – 为什么PDO在连接失败时打印我的密码?
  2. hdu2544 最短路-邻接表+优先队列实现dijkstra
  3. C语言 extern “C” - C语言零基础入门教程
  4. android 底部导航,Android 底部导航之BottomNavigationBar
  5. SAP 图标查找及方法
  6. Luogu P2595 [ZJOI2009]多米诺骨牌 容斥,枚举,插头dp,轮廓线dp
  7. 常见的SQL面试题:经典50题(附详解)
  8. 人声混音处理的基本步骤和常用插件
  9. 【每日学习3.31】 筹备腾讯三面 - 阿V
  10. 如何在PowerPoint中添加幻灯片编号
  11. 计算机除数的时候怎么会有分数,在做除法运算时,为什么0不能做除数?
  12. getMonthsetMonth方法
  13. 一文带你了解Serverless架构及应用场景
  14. app与后台通信完整流程
  15. stm32学习开发记录:OLED——I2C
  16. 其他|Cherry 键盘 Fn 锁定切换方法
  17. 根据cron表达式获取最近几次执行的时间
  18. vue 显示日期只显示年月_vue获取年月日
  19. 【微信小程序】自定义加载动画3
  20. 罗曼 matlab,成年人简易钢琴教程100首

热门文章

  1. 【PC工具】200324更新百度网盘下载工具——最新百度网盘下载工具使用方法及注意事项...
  2. 【强化学习】DQN及其延伸算法
  3. 我理解的javascript事件循环(一)
  4. 硬分叉升级越来越近,BCH社区都在做什么?
  5. 实现基于注解(Annotation)的数据库框架(三)自定义注解(Annotation)
  6. 3种常用的防盗链的方式
  7. Maven和Spring mvc下的页面的跳转与取值
  8. django创建一个管理员用户
  9. WordPress数据库及各表结构
  10. Mylyn 2.0,第 2 部分: 自动上下文管理