一种使用LoRa通信的OTA差分升级方法
2022-06-21刘洋,王剑
刘 洋,王 剑
(1.中国民用航空飞行学院 航空电子电气学院,四川 广汉 618307;2.清华四川能源互联网研究院,四川 成都 610213)
0 引 言
LoRa(Long Range Radio, LoRa)是一种远距离无线电,因采用线性调频扩频技术,具有长距离和低功耗的特点,工作于非授权频段,被广泛部署于智能表计、智慧农业、智能物流等多个物联网垂直行业,前景广阔。
然而,由于LoRa通信通常采用星形组网,且目前较多应用使用LoRa“点对点”通信模式,在大面积工程应用时存在频点冲突和固件升级困难的问题。现有的全量升级方案常用于初始化设备和恢复出厂设置时的批量升级,固件体积庞大,升级耗时,不适用于低速率的LoRa通信场景。增量升级,又称差分升级,通过使用新旧版本的差异文件对旧固件做还原操作,差分固件体积小,适用于应用升级(In Application Programming, IAP)和空中固件升级(Over the Air, OTA)。
本文提出了一种用于LoRa通信的OTA差分升级方法,使用开源差分算法Bsdiff和压缩算法FastLz77对新旧固件做差异提取并压缩,以减小固件体积。为保证固件传输的可靠性,固件数据包使用LoRa跳频和循环异或加密技术传输。文中详细介绍了OTA系统构成、固件包制作和传输过程,最后搭建了OTA测试环境以验证升级方案的可靠性。
1 OTA升级原理和系统组成
由于LoRa通信的速率不高,以最高速率(扩频因子SF=7、编码率CR=4/5、带宽BW=500 kHz时)传输255字节的理论时间为135 ms。因此,OTA升级方案应选择差分固件升级,通过对待升级的固件做差分,减小固件体积。
差分升级的基本原理如图1所示,主要包括差分包制作、差分包传输、差分包还原三部分。首先将新固件与旧固件做差分,得到补丁文件;之后将补丁文件通过LoRa通信下发至待升级的终端设备;最后终端设备根据补丁文件和已有旧固件执行还原操作得到新固件。将新固件写入FLASH,设置终端程序跳转到新固件的位置并执行,实现空中升级。
图1 差分升级基本原理
本文执行OTA差分升级系统组成如图2所示。系统由LoRa主、从节点构成,相关定义如下:LoRa服务器为Master节点,由PC上位机和USB转LoRa设备构成;LoRa待升级终端为Slave节点。每个Slave节点有唯一的ID号,服务器已知各Slave节点ID号。待升级的新固件定义为New,旧固件定义为Old,补丁文件定义为Patch。
图2 OTA升级系统组成
此外,需按功能划分Slave节点固件和升级参数的存储区域,在应用程序执行过程中,将OTA接收的固件包存入相应区域。FLASH分区为BootLoader_Flash、APPA_Flash、APPB_Flash、Patch_Flash、Update_Flash、Other_Flash。其中,BootLoader_Flash用于启动固件存放空间,负责patch文件的还原,新固件启动引导。APPA_Flash、APPB_Flash和Patch_Flash分别用于存放新固件、旧固件和补丁固件。Update_Flash用于存放升级固件信息,Other_Flash是其他信息的预留空间。
2 构建patch补丁固件
Slave节点的FLASH存储器一般按照完整扇区进行擦除后写入,升级固件需要按扇区大小分包写入。因此,patch补丁固件按FLASH扇区大小进行分块做差分,每个FLASH块的差分结果增加相应块序号信息和校验信息,组成patch固件子包patch_pkg_。最后将新固件信息和patch固件子包信息合并成完整的patch补丁固件。子包差分固件生成示意图如图3所示。Patch补丁固件包具体生成步骤如下:
图3 子包差分固件生成示意图
(1)固件分块。将新固件和旧固件按Slave节点的FLASH扇区大小(Flash_Page_Size=1 024 B,2 048 B等)分成若干个固件子块,如式(1)。
(2)子块差分。对比具有相同块号的新、旧固件子块(New_pkg_, Old_pkg_)内容的一致性,若两子块内容相同,则不对该新固件子块创建补丁内容,否则使用开源差分算法Bsdiff计算两子块内容的差分结果bsdiff_out_,若新固件的子块数大于旧固件子块数(>),则多出的新固件子块不计算差分,直接将该新固件子块内容作为差分结果。
(3)差分块压缩。由于差分结果具有高度稀疏特性,采用压缩算法可进一步减小固件的数据量。调用fastLz77算法对新固件子块差分结果bsdiff_out_进行压缩,得到新固件第个子块的补丁bsdiff_fastLz77_out_。
(4)合并子块补丁。将新固件信息和压缩后的固件子块补丁组合,创建patch固件。patch固件由头信息块patch_header和各子信息块patch_pkg_依次排列构成,其中头信息patch_header包括总差分包数patch_pkg_total、新固件的文件大小newFile_size、新固件的md5信息摘要newFile_md5;子信息块patch_pkg_由当前子块序号、子块差分压缩包大小size_、子块差分压缩包bsdiff_fastLz77_out_、子块差分压缩包的CRC8校验值组成。
3 LoRa固件传输
由于LoRa传输容量有限,单次无法发送全部patch补丁固件,需要拆分patch补丁固件进行多次传输。Master节点将Patch补丁固件按照单次最大传输字节长度(Max_Send_Size)可分为若干(nSend)包,send_pkg_1,send_pkg_2,...,send_pkg_。Master与Slave 每次交互发送一个OTA数据包OTA_pkg_,OTA数据包由OTA_header、OTA_Size、send_pkg_和sum32校验值构成,发送至Slave节点,采用报文内容加密和跳频方式传输。
3.1 报文加密
采用指定密钥循环异或(XOR-Cycle)的方式对报文加密。首先计算Slave节点ID值的128位信息摘要MD5,将明文报文与计算的MD5值依次按字节遍历做异或处理,生成加密报文。由于采用异或加密,因此解密与加密的过程相同。其中,Master对报文加密,Slave对报文解密。加解密方法描述如下:
假设原始报文的明文字节数组=[,, ...,a],密文字节数组为=[,, ...,b],共计字节;Slave节点的ID为ID=[id, id, ..., id]共计字节。
(1)计算MD5。计算Slave节点ID的128位MD5信息摘要值,MD5(ID)=[md5_1, md5_2, ..., md5_16]。
(2)循环异或加密。将明文与计算的MD5值依次按字节遍历做异或加/解密处理:=⊕ md5_1;=⊕md5_2 ;…;=⊕md5_16;=⊕md5_1;=⊕md5_2;…;b=a⊕md5_。完成加解密。
3.2 跳频传输
补丁固件使用LoRa传输时会极大占用当前通信信道,严重干扰其他使用当前信道的设备正常工作。因此,在传输补丁固件包时使用跳频传输方式,在多个业务信道随机传输,避免信道拥堵。跳频传输步骤如下:
(1)划分信道。将LoRa通信频段按照0.2 MHz划分为若干通信信道CH=[ch_1, ..., ch_, ch_+1, ..., ch_, ..., ch_]。
(2)Master节点设置信道信息。Master节点发送(ch_)的报文中带有Slave响应节点的跳频信息ch_,Master节点发送结束后在对应的Slave响应频点(ch_)接收Slave回复报文,如果Slave节点未及时响应,则Master节点使用上次的频点(ch_)重发报文信息,并切换至Slave响应频点(ch_)等待响应,再次超时响应则结束当前数据传输。
(3)频点选择。跳频频点ch_由Master节点随机在所有备选信道中选取。
3.3 传输流程
3.3.1 Master固件传输
Master节点固件传输流程如图4所示。Master节点首先初始化为默认信道(ch_1),在默认信道发送报文读取指定ID的Slave节点运行状态。
固件传输之前先在默认信道下发OTA升级信息,同时设置Slave节点应答频点ch_并切换Master的接收频点为ch_,等待终端应答。若终端正常应常,Master发送第个OTA数据包,并指定终端应答频点ch_,切换Mastert的接收频点为ch_,等待终端应答,重复该过程直到patch固件发送完成。
图4 Master节点传输流程
3.3.2 Slave固件接收
Slave节点接收patch补丁固件的流程如图5所示。Slave节点处于空闲状态时,切换LoRa通信模式为接收模式,并设定接收信道为默认信道(ch_1)。接收到报文信息后,立即进行解密处理,如果解密后的报文满足patch补丁固件传输流程,则根据报文进行回复。
图5 Slave节点传输流程
4 Slave节点固件更新
Slave节点接收完OTA升级包后,将执行固件更新操作,还原固件并检查固件的一致性。运行BootLoader引导程序,读取Patch_Flash区域的patch补丁固件信息,提取patch_header和patch子信息块patch_pkg_;从patch子信息块patch_pkg_提取子块差分压缩包bsdiff_fastLz77_out_和子块差分压缩包的CRC8校验值。使用fastLz77解压算法对子块差分压缩包bsdiff_fastLz77_out_解压,计算解压后数据包的CRC8校验值,如果计算的校验值与子信息块patch_pkg_的校验值相同,则使用bspatch还原算法和APPB_Flash存储区第个扇区的固件信息还原新固件子包,并将其写入APPA_Flash存储区第个扇区,重复直到还原所有子信息块。
一致性校验根据OTA升级信息,从APPA_Flash存储区读取指定长度为新固件newFile_size字节数的数据,计算MD5值。如果计算的MD5值与新固件的MD5信息摘要newFile_md5相同,则OTA升级成功,将APPA_Flash存储区的新固件拷贝至APPB_Flash存储区;否则OTA升级失败。将APPB_Flash存储区的旧固件拷贝至APPA_Flash存储区,清除Patch_Flash存储区和相关OTA升级信息。
5 OTA升级测试
为验证基于LoRa通信的OTA升级的可靠性,搭建包括1个Master节点和10个Slave节点的测试环境,其中 Master节点由PC端电脑软件和LoRa透传模组组成。PC端电脑软件完成对Slave节点的OTA升级流程和协议控制,此外还制作patch文件;LoRa透传模组接口为USB转LoRa,模组如图6所示,负责将PC端电脑软件发出到USB口的数据转换成LoRa通信无线方式发送。Slave节点的参数信息见表1所列。
图6 USB转LoRa模组
表1 Slave节点参数
同步Master节点和Slave节点的LoRa跳频信道划分,配置默认信道为ch_1:472.5 MHz,从472.7~485.1 MHz,间隔0.2 MHz,共计62个跳频信道。其余LoRa通信参数设置为带宽500 kHz、编码率4/5、扩频因子12。为模拟信道冲突,10个Slave节点都在ch_1信道每隔10 s随机发送业务数据。
Master节点选择测试用新固件new.bin,大小为31.2 KB;旧固件old.bin,大小为33 KB;依次执行固件分包、子包差分、子包压缩、patch文件拼包操作,生成patch补丁固件源文件。其中,固件按照扇区1 KB进行分包,patch补丁固件源文件(patch.bin)大小为2.3 KB。
OTA传输的有效patch数据包设置为255字节,Master节点将patch补丁固件按照255字节分成10个数据包,每个数据包增加头文件信息OTA_header、整包数据量OTA_Size和sum32校验值,构成OTA数据包。Master节点发送报文由Slave节点1的ID计算MD5值循环异或加密;默认信道472.5 MHz发送广播报文,查询该Slave节点1的状态、固件版本号,发送OTA固件升级信息,并设置随机响应信道ch_为17,即476.1 MHz,设置Master节点在476.1 MHz等待接收Slave节点1的回复报文,等待延时120 ms后Master报文接收成功。
Master节点在信道476.1 MHz发送第一帧OTA数据报文,并随机指定Slave节点的响应跳频信道ch_为32,即479.1 MHz,发送之后设置Master节点在479.1 MHz等待接收Slave节点的回复报文,等待延时260 ms后Master报文接收成功。
Master节点依次发送至最后一帧OTA数据报文,Slave节点均正常响应。此时,Slave节点重启进入BootLoader引导程序,执行固件还原操作,校验新固件MD5,并将该新固件写入APPB_Flash区进行备份,程序跳转至APPA_Flash区,正确执行,OTA升级完毕。多次测试结果见表2所列,成功率为100%。
表2 OTA升级结果
6 结 语
本文提出了用于LoRa通信的OTA差分升级方案,通过Bsdiff差分和FastLz77压缩进一步减小了固件的体积以适应LoRa低速率传输场景。为避免对现有业务信道的传输冲突,使用LoRa跳频和循环异或加密方式对固件传输信道和固件数据包进行优化,显著提高了固件升级的成功率。验证结果表明,本方案适用于LoRa“点对点”通信场景下的固件升级应用。