GPRS网络远程固件升级(OTA)流程详解 拆解

test 2017-6-14 3405


零、前言

        最近看到坛里不少人问远程升级(OTA)相关的问题,干脆把之前一个项目的远程升级流程及方法跟大家分享一下,该项目是个车载产品,基于STM32开发,适合不稳定网络下的远程固件升级,比如GPRS网络远程升级,经过多年的验证,OTA部分成熟可靠。

        本文不涉及具体代码,只提供流程和方法,让大家做远程升级时能多一个思路,搭建适合自己项目的OTA方案。

一、OTA升级协议选择及服务器搭建

        设备通过GPRS网络进行升级,由于GPRS网络的不稳定性,需要选用具备断点续传功能的数据传输协议,主要有两种方式,一是选择通用的传输协议,如FTP,HTTP等,这种方式在服务器的搭建上较为灵活,但底层需要对相关协议进行支持,较为复杂;二是自定义分包传输协议,这种方式需要开发专用的升级服务端,不过底层支持较为简单;各位可以根据自己项目的需求选择一种或多种升级方式,比如我的项目就同时采用了FTP和自定义协议两种方式。

二、升级固件发布

        跟一般的Bootloader升级方式相比,OTA需要在各个过程中对固件的完整性进行验证,固件需要具备校验信息,校验信息可以附加在固件尾部或者是附带一个包含校验信息的文件。此外为了安全起见,可能还需要对固件进行加密处理。

        对此,我的做法是编写一个编译后处理工具,在MDK编译后,自动进行以下操作:

1.        对固件进行CRC32校验,并将校验值写入固件末端

2.        对固件进行AES256加密,并生成CRC32校验码

3.        将文件名、版本号、文件大小、校验码等写入ver.txt文件

4.        根据当前SVN的版本号对固件进行重命名后和ver.txt一起压缩打包

        这样可以保证每次编译后都会生成唯一的升级固件。该固件同时也用于本地升级。

  

三、设备端存储结构

        设备的代码由Boot和App两部分构成,升级固件可以存储在内部剩余的Flash或者外挂Flash中,根据需要在Flash中定义了OTA_INFO、OTA_DATA和OTA_BACKUP三个区块,其作用分别如下:

OTA_INFO: 用来存储固件信息及过程信息,主要包括升级固件文件名、版本号、固件大小、校验信息等、升级标志位等。

OTA_DATA: 用来存储升级固件

OTA_BACKUP: 用来备份旧版固件

四、固件下载

        固件下载包含手动升级和自动升级两种方式,升级流程如下:

1.        收到指令或者定时下载Ver.txt文件并更新OTA_INFO的信息

2.        判断当前固件版本后是否需要升级,不需要则结束升级流程

3.        下载升级固件并存储到OTA_DATA分区,下载完毕后对固件进行CRC32校验,如果校验通过则在OTA_INFO置请求升级标志位

4.        将OTA_INFO区块置写保护

5.        重启进入Bootloader进行固件升级

五、固件升级

        Bootloader启动后检测OTA_INFO有无请求升级标志,如有则进入升级流程:

1.        对OTA_DATA的固件进行校验,校验通过进行下一步,否则退出升级流程

2.        检测当前App固件是否完整,是则进入3,否则进入5

3.        检查OTA_BACKUP扇区有无当前固件备份,有则进入4,否则进入5

4.        将当前App通过AES256加密后写入OTA_BACKUP 

5.        解除App区域的写保护,将升级固件解密并写入,写入完毕后进行校验,校验通过后将APP区域写保护恢复

6.        将OTA_INFO请求升级标志置为升级成功标志,重启进入App运行

六、 固件恢复

        对某些安全性要求较高的产品,Bootloader在跳转至App前会对App进行完整性校验,如果校验失败,会根据OTA_INFO的配置进行相应的处理,如恢复OTA_BACKUP的固件或者是直接进行异常处理等。

七、 总结

        以上就是整个OTA升级流程,确保了从固件发布到下载及更新等过程中的唯一性、可靠性、安全性。比较严酷的测试是将设备配置为连续升级模式,然后在下载、更新过程中的任意时刻中断电源重启,累计1000次,没有出现任何问题。欢迎拍砖。


最新回复 [0]
返回