针对城乡公交站牌显示终端现场升级与维护困难的问题,提出了一种基于应用程序(IAP)技术的嵌入式系统远程升级设计方案。
通过IAP技术配合改良过的远程升级程序代替传统的现场烧写调试,节约了奔赴现场调试的时间和成本。
针对远程升级过程中被恶意攻击、固件文件安全传输和可靠更新等安全性问题,提出利用分包校验和设置临时程序存储区域的方法。
采用多服务器协同设计和严格权限管理方式,在服务器端通过权限管理来提升升级操作过程中的安全性。
引言
公共交通智能化是当前的大趋势,安装于村镇道路旁的城乡公交站牌显示终端能实时显示公交车到离站信息,到站距离,能极大地方便老百姓的公交出行。
传统的升级方式通过预留的升级接口,通过切换BOOT模式使用串口或者JLINK接口来进行升级。
城乡公交站牌安装点位偏远、分散,要实现设计缺陷修补、功能改进或
性能提升等需求,需要到现场拆卸设备,增加了维护成本。
本设计在利用城乡公交站牌显示终端现有的数据链路的基础之上,通过协议的扩展,实现远程升级固件。
提高了嵌入式设备的可维护性,并通过多服务器协同和严格的权限管理机制,提升了升级过程中的安全性,通过CRC加密算法和断点续传机制,保证了升级文件的可靠性。
系统组成
本文的升级系统由业务服务器、站牌显示终端和升级服务器三部分组成。
业务服务器通过与站牌显示终端的网络连接,实现车辆到站的信息发布。
升级服务器在业务服务器发起升级请求后,响应站牌显示终端的升级请求,实现升级数据的下发。
站牌显示终端通过4G网络登录业务服务器,接收业务服务器下发的数据。
城乡公交站牌显示终端由微控制器(MCU GD32F103RB)、4G无线模块(移远EC20)、数码管显示驱动单元、实时时钟、供电单元等组成,主要实现上报数据和接收服务器下发的车辆到离站信息等功能。
远程升级功能是利用城乡公交站牌显示终端本身具有的网络连接特性,通过网络协议的接口,实现对站台显示终端的固件程序的更新:即更新微控制器MCU内部的程序,以达到改进和提升的目的。
升级原理
GD32F330 MCU是兆易创新公司推出的基于Cortex®-M4内核的微控制器[3][4],是国产自主品牌的32位MCU,集成外设单元丰富、性能强劲,成本低廉,是替换STM32系列MCU的首选。本文选择GD32F330RB作为站牌显示终端的主控MCU。
微处理器的编程方法通常有两种:通过串口或者JTAG等接口进行编程的在系统编程(In System Programming,ISP)模式、在应用程序控制下的在应用编程(In Application Programming,IAP)模式。
本设计采用的预先将Bootloader程序+应用程序通过ISP方式下载到终端作为出厂程序,出厂后通过IAP模式对程序进行升级。IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写。
本系统设计两个程序[7]:Bootloader(引导加载程序)和App
(应用程序)。
Bootloader程序不执行应用的功能操作,只负责在开机启动时对系统升级数据进行更新,并跳转到对应的App程序。App程序为用户功能代码,执行用户功能操作,同时接收服务器的升级请求,将升级代码数据保存到特定的FLASH位置。
本系统中使用的芯片GD32F330RB的FLASH存储器大小是128K,此空间被划分为三大块,分别用于运行Bootloader程序,APP程序1,APP程序2。
其中0x801E000-0x801f000这4K空间用来存储升级相关的环境变量,包括升级标志、数据长度,CRC32校验后的校验码。
Bootloader设计
Bootloader程序是本方案的核心,需要完成升级文件检测,程序校验,固件更新以及程序跳转等功能。
- 微处理器上电/复位后,从地址0x08000000开始运行Bootloader程序。
- Bootloader完成MCU的初始化,然后从0x0801E0000地址读取环境变量。
- 根据环境变量中的升级标志位来判断是否要进入程序升级模式。
- 如果不需要升级,读出需要跳转的程序入口地址,执行程序跳转操作,跳转到0x08002000(APP1程序区)处开始运行应用APP;如需要升级,进入升级流程,进行APP代码的更新。
- 在升级流程中,首先读取环境变量中的待升级程序的长度和CRC校验码,并计算APP2程序区地址中的存储的程序的CRC32的校验码,与环境变量中的校验码进行比对。
- 校验码一致的话进入FLASH操作流程,根据需要对FLASH扇区进行擦除,然后从APP2对应的位置读取程序数据写入APP1对应的位置;校验码不一致的话,放弃升级。
- 升级完成或者升级失败均需要清除升级标志位,然后软复位MCU。
通信协议设计
与服务器通信,需要遵循一定的通信协议,才能正确的进行升级。
当前采用的连接为TCP长连接,大端模式的网络字节序。
为了降低远程传输数据出现的误码率,把升级固件分成小包进行传输。
固件数据包的分包长度设置为256个字节,分包序号表示当前传输的数据包是第几包,当出现传输错误,帧数据包校验不正确时,会返回错误接收的数据包给服务器,服务器根据分包序号,重新发送此分包的数据包。终端正确接收了当前的分包,给服务器返回成功的应答信号,服务器发送下一个分包,直到固件数据发送完成。
APP程序设计
APP程序是实现终端功能的软件。本终端主要实现的功能是验证登录业务服务器和接收服务器下发的车辆到离站信息,并在终端的LED上显示公交车到站距离。
将APP2区的(0x0801E0000)开始的一个扇区用来存储升级程序的环境变量,主要包括程序是否需要升级的标志信息,程序的长度和校验码。
Bootloader运行后首先读取0x0801E000位置处的环境变量,判断程序是否需要升级。如果程序需要升级,就需要根据环境变量中存储的程序长度和校验码对APP2区的程序进行CRC校验,判断校验码是否与环境变量中的校验码一致,若不一致,则清除环境变量的升级标志,跳转到APP1执行;若一致,则擦除APP1程序区,将APP2程序区的数据拷贝到APP1程序区。拷贝完成以后,清除环境变量的升级标志,跳转到APP1执行。
固件升级的安全关系到整个系统的安全,因为固件将彻底的替换掉终端正在运行的程序。因此需要从几个方面来保证新的固件程序在下发升级以后,不会造成系统的大面积崩溃。
- 需要保证新版本的固件程序经过了严格的测试才能上传到服务器中。
- 要保证新版本的固件程序拥有再次升级的功能,这样在出现bug或者错误以后,可以迅速进行升级补救。
- 分批次进行升级,保证升级后的设备运行稳定,无故障,再扩大升级规模。
- 固件程序升级过程中,实行Bin文件加密校验,保证升级固件的完整性。
- 提升服务器的安全等级,防范内部或者外部的恶意攻击。
终端开机后主动连接业务服务器,根据JT808协议,完成终端设备的注册、登录,并根据业务服务器下发的到站信息数据,在本地LED上实现车辆信息的显示。如果需要对新版本的固件进行升级,则开启升级流程。
- 上传经过测试的BIN文件到业务服务器,业务服务器经过身份认证和密码验证,确认上传的文件合法,并将BIN文件同步到升级服务器。
- 在业务服务器的终端升级管理页面选择需要升级的终端设备,下发升级命令,根据待升级终端的数量来进行身份认证。在大于5台待升级设备时,需要请求更高的系统权限。
- 业务服务器给终端发送升级命令,包括升级服务器的IP和端口号。
- 终端主动断开与业务服务器的网络连接,根据下发的升级服务器IP和端口号,连接升级服务器,连接过程中会发送自己的终端ID和当前版本给升级服务器。
- 升级服务器确认终端的版本与待升级的版本都正确无误后,发送新版本固件程序的固件程序大小,CRC校验码等信息给终端,在收到终端的确认信息后,开始分包发生固件信息给终端。
- 终端根据协议,对分包数据进行校验,校验无误后,写入FLASH中对应的存储区域。每接收完一帧数据,向升级服务器请求下一段数据。若是校验出错或者是网络中断,将会重复请求未接收完成的数据,实现断点续传。
- 在终端接收到最后一帧数据并写入FLASH之后,将根据最开始接收到的程序大小和CRC校验码对整个写入FLASH的程序文件进行校验。在校验无误后,置位环境变量中升级标志。
- 断开与升级服务器的网络连接,软复位MCU。复位后执行Bootloader里的程序更新操作,程序更新后,跳转到APP1程序运行。
- 终端连接业务服务器,在注册登录过程中上报自己的终端ID和版本信息。并根据业务服务器下发的命令实现基本功能。此时在业务服务器上将显示当前终端的版本信息。