引言
随着对系统功能、性能要求的不断提高,或为了消除缺陷,用户常常需要对物联网终端设备软件进行升级[1]。物联网终端软件升级需要对FLASH存储器的数据进行擦除和写入,目前对FLASH存储器的编程主要包括了JTAG、ISP和IAP三种方式[2]:JTAG编程方式主要用于初期系统的实验室开发和调试;ISP方式需提供硬件资源和中止软件运行才能完成升级[3];IAP方式则允许在应用程序正常运行下对FLASH存储器中另一段区域的程序代码进行读/写操作。这3种方式都要人工连接相应的线缆或者设备进行固件升级。
物联网技术的逐步发展,使其在很多领域的应用越来越广泛[4]。而物联网设备在实际使用过程中存在两种问题[5]:一是用户在使用过程中,可能需要改进或增加功能;二是程序本身有缺陷导致无法正常工作。物联网是由很多个终端设备组成,具有分布区域广、设备小巧等特点[6],要解决上述两个问题,实现固件更新的任务费时费力。因此,本文提出一种无线升级固件的方法,通过对固件进行数据分段压缩,减少数据的传输次数和提高无线升级的成功率,进而降低维护成本、提高工作效率。
1系统构造与实现
一个农业物联网监控系统由多个独立的能够完成一定功能的物联网传感终端和一个用于对整个系统进行升级控制的物联网数据网关设备组成。每个物联网传感终端在出厂的时候都会通过JTAG装载独立的引导程序。该引导程序中嵌入无线通信程序,正常工作情况下每个终端运行用户程序,实现特定的功能并上报数据到数据网关。当需要对某个无线终端进行固件升级时,则通过电脑控制数据网关向特定的物联网传感终端设备发送升级指令,终端设备一旦接收到升级指令即跳转至引导程序,并等待网关设备发送的固件升级数据,一直等待到固件数据升级结束之后再跳回至应用程序[7],系统架构如图1所示。
图1 无线固件升级架构
1.1引导程序的实现
本文的具体设计方案,采用TI公司低功耗单片机MSP430F5438为主控芯片,其片上主存储区的类型为Flash,在正常工作电压下,程序可对Flash进行擦写操作,因此特别适合程序升级。物联网传感终端系统中将Flash分成3个区域:一个为引导程序区;一个为信息存储区,存储应用程序和引导程序共用的数据,如升级标志信息、CRC校验值、固件大小、版本信息等;最后一个区为应用程序区。Flash分区如图2所示。
图2 单片机Flash分区
主控芯片在上电复位后,首先执行引导程序。引导程序主要工作是重新映射中断向量地址,将除复位中断外的所有中断映射到应用程序中,读取信息区中的数据,判断是需要升级还是跳转至应用区执行应用程序。这两个区域通过特定的指令可以实现相互跳转,并以此实现无线升级。
1.2数据压缩
在无线固件升级过程中,有两种情况可能导致升级的失败或升级时间较长:(1)由于传输链路不稳定可能导致同一包数据需要多次发送;(2)升级程序数据量大,而传输速率较低,不完整的升级代码或不正确的升级代码都会使系统瘫痪[8]。考虑到整个终端设备的成本,很多远程升级系统会通过引导程序接收升级程序数据[911]。如果能够将这些数据进行压缩处理,不仅减小数据的存储空间,降低产品成本,增加产品的竞争力,而且减少了传输的数据包,提高了固件升级技术的可靠性。所以本文通过引入压缩技术,利用PC机对固件数据进行无损压缩,而在引导程序实现对压缩的固件数据解压,并把解压的数据写到用户装载程序区来实现物联网终端设备的固件升级。
由于单片机系统内存有限,在实际应用中需要将原始固件数据分解成单片机内存所能容纳的一个个小文件,进行分块压缩[12]。分块后的固件由于内部数据特征的差异导致了每个分块固件数据压缩率不同,所以要对压缩后的文件进行结构化处理。具体编排方式是将所有文件按先后顺序编号,建立文件地址索引表,并在分块压缩后的固件中保存压缩前的固件长度、压缩后的固件长度及当前分块固件的序列号,在解压阶段每个分段只需指出所用数据的序列号、数据压缩前后的文件大小,即可通过调用解压程序取得压缩前的数据。本文所涉及的系统选择了以4 KB大小的段进行压缩,基本结构如图3所示。
图3 分段压缩结构
目前数据压缩技术的方法有很多种,但由于单片机系统运行速度不快,内存资源有限,所以传统的数据压缩技术不适合在单片机上运行。为此,本文选用了在单片机上实现起来较为理想、压缩率较高、编译码算法也较为简单的两种无损压缩算法进行评测:MiniLzo与LZSS,并在压缩率、解压时间、所消耗的资源等方面做了一些比较。本文选取了大小为123 072字节的原始固件进行测试,其中整体压缩是该固件没有通过分块进行压缩之后的结果;分块压缩是采用4 KB为单位进行压缩之后的结果;解压程序所占的ROM大小是在编译软件IAR编译出来的结果;解压时间是在PC机上测试的结果,具体数值如表1所列。
从表1中可以看出,LZSS解压程序比MiniLzo更节省ROM空间,特别适合存储资源比较紧张的单片机;LZSS整体压缩与分块压缩比率也优于MiniLzo。但是两种算法在同一台电脑的解压运算时间相差比较大,LZSS解压需要的时间差不多是MiniLzo的10倍。这将带来两个不利因素:一方面解压的时间延长会导致物联网终端设备功耗的增加;另一方面解压时间过长增强了系统不稳定性。虽然MiniLzo需要更多的ROM空间,但是即使内存资源有限的单片机也完全可以接受,所以无线固件升级方案压缩解压缩算法选用MiniLzo。
1.3数据完整性校验
进行数据完整性校验是为保证数据的完整性,用一种指定的算法对原始数据计算出一个校验值。CRC已经广泛应用于错误数据的侦测,而生成多项式的选择是CRC算法实现中最重要的部分,所选择的多项式必须有最大的错误检测能力,同时保证总体的碰撞概率最小。多项式最重要的属性是它的长度,也就是最高非零系数的数值,因为它会直接影响计算校验和的长度。
从理论角度讲,CRC不能完全可靠的验证数据完整性,因为CRC多项式是线性结构,很容易通过改变数据方式达到CRC碰撞,假设一串带有CRC校验的代码在传输中,如果连续出现差错,当出错次数达到一定次数时,几乎可以肯定会出现一次碰撞(值不对但CRC结果正确),但随着CRC数据位增加,碰撞几率会显著降低。
根据参考文献[13]中的公式g(x)=p(x)(1+x),可以得出一个CRC多项式与最大错误检测位数:
(1)
式中,r为CRC校验用的监督码。根据式(1)可以得出每种多项式对应的最大不冲突数据字节数,如表2所列。
当物联网终端设备接收到一个完整的固件之后,必须进行一次CRC校验,以保证数据的正确性。根据表2所得,为了保证总体的碰撞概率最小,当固件大小大于16 KB的时候,CRC32成为校验整个新固件据的首选。
1.4断点续传功能
在传输过程中,终端升级文件分成段进行传送,可能存在数据丢失、终端丢线、掉电等故障,导致升级文件传送不全。而传输程序文件与传输一般数据参数文件不同,需要强调传输的可靠性和完整性[14-16]。为了防止由于无线网络信号差等造成文件传输中断,而使升级文件全部重新传送的情况发生,本系统设计断点续传的功能。
在单片机引导程序中定义一段变量空间,并用__no_init来修饰该变量空间,禁止系统启动时,该变量空间初始化,并且通过修饰符@定位这段空间到指定的地址上。这些全局变量用来记录当前升级数据包的序列号、长度及其他相关参数数据,保证单片机由于外界干扰导致重启或升级失败的时候,能迅速找到上一个升级包处理成功时所记录下来的参数,并能从上一次升级会话的断点处继续升级。断点续传功能不仅可以节省网络资源,降低系统运行成本,而且可以大大提高无线升级的效率[10]。
2固件升级流程
在无线固件升级的过程中,PC机通过有线的链路控制网关设备实现物联网终端设备的固件升级,无线终端固件升级流程如图4所示。
图4 终端设备升级流程
主要操作步骤如下:
① 当要升级的终端设备正在运行应用程序,由PC机控制网关设备向该终端设备发送固件升级指令,终端节点响应该升级指令,跳转至引导程序,并等待网关设备特定的数据包。
② 终端节点周期性申请固件数据包,并在一个复位时不会被初始化的变量中记录当前升级状态,如上次断点处、故障原因等,保证终端设备固件升级的断点续传。
③ 终端节点收到网关设备的固件数据包,当接收完一个完整的压缩分段固件后,利用解压缩函数实现对固件的解压缩,并把解压缩后的固件写入指定存储空间。
④ 网关设备发送完终端设备固件之后,再向该终端设备发送当前升级固件的版本信息、校验值。终端设备收到该数据之后,对整个解压后的固件进行校验,如果成功,则更新版本信息到信息段之中。
⑤ 终端设备固件数据校验成功,则向网关设备发送升级成功指令,并跳转到应用程序中运行;否则,发送固件升级失败指令,重新等待升级。
3测试结果
为了验证远程程序更新机制的有效性和可靠性,选择了与网关设备相距不同距离的物联网终端设备进行固件升级测试,无线通信速率为100 kbps,其中信号强度是网关设备收到终端设备数据包时所反映出来的RSSI数值,相关测试统计数据如表3所列。
从测试结果可以看出,对于网关设备无线信号比较强的终端设备来说,固件升级过程中的数据传输速度较快且很多时候都能一次性完成,固件升级效率非常高。而在无线信号相对比较弱的终端节点,会导致数据丢包,固件数据传输的速度相对较慢,而且传输中断的次数也随无线信号质量变差而增多。断点续传技术的引入,在信号较差的地方,有助于提高固件升级成功的概率。
结语
本文所设计的基于MSP430的无线升级技术,实现了固件数据压缩、数据完整性校验及断点续传等功能,保证了该升级技术的稳定性和可靠性。特别是压缩技术的引入,提高了无线固件升级的速度和效率,降低了功耗。该远程程序更新机制的设计实现,使设备的软件升级更为方便高效,大大降低了设备的升级维护成本,具有广阔的应用前景和较高的使用价值。