在进行产品设计时,不可避免的会存在一些BUG,所以当产品被销售出去以后,为了能够及时解决客户遇到的问题,需要实现相对便捷的产品升级方式,以此来满足客户的需求,同时降低维护成本,这其中比较关键的是产品硬件的固件更新和升级。
目前可以实现远程升级的方式有很多,近距离升级方式一般会通过移动设备的蓝牙,WIFI,无线模块来作为程序升级的媒介;远距离或者跨区域升级程序通常都会选择WIFI、5G、4G、NB或者无线模块加网络模块的复合方式,无论采用那种方式进行程序升级,都需要完成三部基本的操作:
1、将需要升级的程序包放置到可以获取的网络位置。
2、需要实现升级包下载到终端的传输途径及协议,比如通过HTTP get抓取。
3、终端本地的校对和存储区域的分区。
我们具体来看一下每个步骤需要实现的具体内容:
将需要升级的程序包放置到可以获取的网络位置
如上图所示,大多数的设计者会将升级文件存储到“服务器”的固定路径中,并制定名称,更新判断标志,也就是提示终端有新的升级包存在。这个“服务器”可以是专业的远程服务器、终端PC或者也可以用带有无线接口的存储设备。最近有一种需求是要实现便携式升级设备,就是将升级文件存储到一个可以随身携带的设备上,用户或者维护人员可以灵活的拿到任意的维护区域实现升级操作,这种方式十分灵活,不需要终端设备安装成本相对比较高的网络设备或者模块,也无需依赖使用环境的网络情况,只需要自生带有简单的可供与便携式升级设备相匹配的无线模块即可,并且再不需要升级的时候,这个模块不需要工作,从而节省功耗,甚至在一些情况下,终端设备根本不需要内部安装无线模块,便携式设备可以扩展一个接收端,直接插到终端上即可。
传输途径及协议:
目前主流的升级方式主要采用HTTP协议和私有分包协议两种,对于前者来说有标准的POST及GET指令可以实现整个的升级协议和传输过程;私有协议比较灵活,传输的方式大多采用分包传输降低数据丢包,同时在协议传输过程中会增加校验和重发机制,保证升级过程的可靠性。虽然两种方式有所不同,但是它们都有一个必须的过程,那就是组网,也就是说采取一种必要的方式来实现服务端与终端之间的互联互通,目前市面上采取的组网方式很多,特别是在智能锁一类的设备中采用的方式五花八门,有通过微信连接的,又通过APP设置的,也有采用直接输入网络名和密码的方式,这些方式看起来很复杂,其实只是实现了一个功能,那就是把服务端的网络名及密码端口告诉终端,终端通过这些账号信息登录相应的网络即可,我们同样以示意图的方式来具体说明。
当APP与终端实现连接之后,可以实现两种升级方案:
1、APP将本地下载的升级包通过建立的网络传送给终端。
2、APP将本地WIFI密码及账号以及升级IP及端口发送给终端,终端采用HTTP协议从远程获取升级包。
终端本地的校对和存储区域的分区:
当终端进入升级阶段时,需要考虑几个关键性的问题:
1、接收到的数据是正确的,也就是说数据的校对功能需要实现。
2、终端内部存储区需要至少划分三个区域:BOOT区、运行区、备份区,之所以设置这么多的分区是为了保证升级过程的可靠性和安全性,BOOT区实现的是程序的跳转功能,当程序下载正常时,终端执行运行区代码,当升级失败时终端执行备份区代码,通常为了尽可能减少内存的消耗,备份区通常存储了可以实现终端运行的最小代码程序,当然目前市面上还有很多不是按照这样的方式分区的应用,有的只是分为两个区域,还有采用外部存储设备作为程序的存储空间,不同的应用方式实现的功能都是相类似的,在设计比较合理的情况下都可以实现稳定的、安全的远程升级过程。
以上是相对完整的固件升级过程介绍,除此之外,在整个固件升级过程中还需要格外注意一些事项,比如升级失败之后的操作:
1、升级文件获取过程中断网,或不明原因的连接失败之后判断连接失败原因,尝试重连,重连超时后需要清空接收缓冲区,清除升级标志,跳转到之前运转程序字段。
2、文件获取结束后的整体校验和升级标志位状态切换。
3、动态FLASH区域分割,这种适合于频繁程序升级的应用,建议使用外部存储器,可以避免反复升级过程中对于终端主控存储单元算坏带来的运行异常风险,通常建议使用可拆卸外部存储器。
4、建议保留一个关键设置参数缓冲区,保留关键设置参数,特别是终端需要对外部设备进行控制时,一些约定参数需要保留,以免造成不必要的损失。