一种使用LoRa通信的OTA差分升级方法(学习)

一种使用LoRa通信的OTA差分升级方式

LoRa(Long Range Radio)是一种远距离无线电,因采用线性调频扩频技术,具有长距离和低功耗的特点,工作于非授权频段,被广泛部署与智能表计、智慧农业、智能物流等多个物联网垂直行业,前景广阔。

然而,由于LoRa通信通常采用星型组网,且目前较多应用使用LoRa“点对点”通信模式,在大面积工程应用时存在频点冲突和固件升级困难的问题。

现有的全量升级方案常用于初始化设备和恢复出厂设置时的批量升级,固件体积庞大,升级耗时,不适用于低速率的LoRa通信场景。

增量升级,又称差分升级,通过使用新旧版本的差异文件对旧固件做还原操作,差分固件体积小,适用于应用升级(In Application Programming, IAP)和空中固件升级(Over the Air)

本文提出了一种用于LoRa通信的OTA差分升级方法,使用开源差分算法Bsdiff和压缩算法FastLz77对新旧固件做差异提取并压缩,以减小固件体积。

为保证固件传输的可靠性,固件数据包使用LoRa跳频和循环异或加密技术传输。

本文详细介绍了OTA系统构成、固件包制作和传输过程,最后搭建了OTA测试环境以验证升级方案的可靠性。

OTA升级原理和系统组成

由于LoRa通信的速率不高,以最高速率(扩频因子SF=7、编码率CR=4/5、带宽BW=500kHz时)传输255字节的理论时间为135ms。因此,OTA升级方案应选择差分固件升级,通过对待升级的固件做差分,减小固件体积。

差分升级主要包括差分包制作、差分包传输、差分包还原三部分。首先将新固件与旧固件做差分,得到补丁文件;之后将补丁文件通过LoRa通信下发至待升级的终端设备;最后终端设备根据补丁文件和已有旧固件执行还原操作得到新固件。将新固件写入FLASH,设置终端程序跳转到新固件的位置并执行,实现空中升级。

系统由LoRa主、从节点构成。

  • LoRa服务器为Master节点,由PC上位机和USB转LoRa设备构成;
  • LoRa待升级终端为Slave节点,每个Slave节点有唯一的ID号,服务器已知各Slave节点ID号。
  • 待升级的新固件定义为New,旧固件定义为Old,补丁文件定义为Patch。

此外,需按功能划分Slave节点固件和升级参数的存储区域,在应用程序执行过程中,将OTA接收的固件包存入相应区域。

FLASH分区为BootLoader_Flash、APPA_Flash、APPB_Flash、Patch_Flash、Update_Flash、Other_Flash。

  • BootLoader_Flash用于启动固件存放空间,负责patch文件的还原,新固件启动引导。
  • APPA_Flash、APPB_Flash和Patch_Flash分别用于存放新固件、旧固件和补丁固件。
  • Updata_Flash:用于存放升级固件信息
  • Other_Flash是其它信息的预留空间

构建patch补丁固件

Slave节点的FLASH存储器一般按照完整扇区进行擦除后写入,升级固件需要按扇区大小分包写入。

因此,patch补丁固件按FLASH扇区大小进行分块做差分,每个FLASH块的差分结果增加相应块序号信息和校验信息,组成patch固件子包patch_pkg_i。

最后将新固件信息和patch固件子包信息合并成完整的patch补丁固件。
Patch补丁固件包具体生成步骤如下:

  1. 固件分块。将新固件和旧固件按Slave节点的FLASH扇区大小(FLASH_Page_size=1024B,2048B等),分成若干个固件子块。
    New = {New_pkg_1,…,New_pkg_n}
    Old= {Old_pkg_1,…,Old_pkg_n}
  2. 子块差分。对比具有相同块号的新、旧固件子块(New_pkg_i,Old_pkg_i)内容的一致性,若两子块内容相同,则不对新固件子块创建补丁内容,否则使用开源差分算法Bsdiff计算两子块内容的差分结果bsdiff_out_i,若新的固件子块数大于旧固件子块数(n>m),则多出的新固件子块数不计算差分,直接将新固件子块内容作为差分结果。
  3. 差分块压缩。由于差分结果具有高度稀疏特性,采用压缩算法可进一步减小固件的数据量。调用fasLz77算法对新固件子块差分结果bsdiff_out_i进行压缩,得到新固件第i个子块的补丁bsdiff_fastLz77_out_i。
  4. 合并子块补丁。将新固件信息和压缩后的固件子块补丁组合,创建patch固件。patch固件由头信息块patch_header和各子信息块patch_pkg_i依次排列构成,其中头信息patch_header包括总差分包数patch_pkg_total、新固件的文件大小newFile_size、新固件的md5信息摘要newFile_md5;子信息块patch_pkg_i由当前子块序号i、子块差分压缩包大小size_t、子块差分压缩包bsdiff_fastLz77_out_i、子块差分压缩包的CRC8校验值组成。

LoRa固件传输

由于LoRa传输容量有限,单次无法发送全部patch补丁固件,需要拆分patch补丁固件进行多次传输。

Master节点将Patch补丁固件按照单次最大传输字节长度(Max_Send_Size)可分为若干(nSend)包,send_pkg_1,send_pkg2,…,send_pkg_n。

Master与Slave每次交互发送一个OTA数据包OTA_pkg_i,OTA数据包由OTA_header、OTA_Size、send_pkg_i和summ32校验值构成,发送至Slave节点,采用报文内容加密和跳频方式传输。

报文加密

采用指定秘钥循环异或的方式对报文加密。首先计算Slave节点ID值的128位信息摘要MD5,将明文报文与计算的MD5值依次按字节遍历做异或处理,生成加密报文。

由于采用异或加密,因此解密与加密的过程相同。
其中,Master对报文加密,Slave对报文解密,加解密方式描述如下:

假设原始报文的明文字节数组A=[a1,a2,…,an],密文字节数组为B=[b1,b2,…,bn],共计n字节;Slave节点的ID为ID=[id1,id2,…,idm]共计m字节。

  1. 计算MD5。计算Slave节点ID的128位MD5信息摘要值,MD5(ID)=[md5_1,md5_2,…,md5_16]
  2. 循环异或加密。将明文与计算的MD5值依次按字节遍历做异或加l解密处理:b1=a1 ⊕ md5_1 ;b2=a2 ⊕ md5_2 ;…;b16=a16 ⊕ md5_16 ;b17=a17 ⊕ md5_1 ;b18=a18 ⊕ md5_2 ;… ;bn=an ⊕ md5_x。完成加解密。

跳频传输

补丁固件使用LoRa传输时会极大占用当前通信信道,严重干扰其它使用当前信道的设备正常工作。因此,在传输补丁固件包时使用跳频传输方式,在多个业务信道随机传输,避免信道拥堵。跳频传输步骤如下:

  1. 划分信道。将LoRa信道频率按照0.2MHz划分为若干通信信道CH=[ch_1,…,ch_x,ch_x+1,…,ch_y,…,ch_n]
  2. Master节点设置信道信息。Master节点发送(ch_x)的报文中带有Slave响应节点的跳频信息ch_y,Master节点发送结束后对应的Slave响应频点(ch_y)接收Slave回复报文,如果Slave节点为及时响应,则Master节点使用上次的频点(ch_x)重发报文信息,并切换至Slave响应频点(ch_y)等待响应,再次超市响应则结束当前数据传输。
  3. 频点选择。跳频频点ch_y由Master节点随机在所有备选信道中选取。

传输流程

Master固件传输
Master节点首先初始化为默认信道(ch_1),在默认信道发送报文读取指定ID的Slave节点运行状态。

固件传输之前先在默认信道下发OTA升级信息,同时设置Slave节点应答频点ch_x并切换Master的接收频点ch_x,等待终端应答。若终端正常应答,Master发送第u个OTA数据包,并指定终端应答频点ch_y,切换Master的接收频点为ch_y,等待终端应答,重复该过程直到patch固件发送完成。

Slave固件接收
Slave节点处于空闲状态时,切换LoRa通信模式为接收模式,并设定接受信道为默认信道(ch_1)。接收到报文信息后,立即进行解密处理,如果解密后的报文满足patch补丁固件传输流程,则根据报文进行回复。

Slave节点固件更新

Slave节点接收完OTA升级包后,将执行固件更新操作,还原固件并检查固件的一致性。

运行BootLoader引导程序,读取Patch_Flash区域的patch补丁固件信息,提取patch_header和patch子信息块patch_pkg_i;从patch子信息块patch_pkg_i提取子块差分压缩包bsdiff_fastLz77_out_i和子块差分压缩包的CRC8校验值。

使用fastLz77解压算法对子块差分压缩包bsdiff_fastLz77_out_i解压,计算解压后数据包的CRC8校验值,如果计算的校验值与子信息块patch_pk_i的校验值相同,则使用bspatch还原算法和APPB_Flash存储区第i个删去的固件信息还原新固件子包,并将其写入APPA_Flash存储区第i个扇区,重复直到还原所有子信息块。

一致性校验根据OTA升级信息,从APPA_Flash存储区读取指定长度为新固件newFile_size字节数的数据,计算MD5值。

如果计算的MD5值与新固件的MD5信息摘要newFile_md5相同,则OTA升级成功,将APPA_Flash存储区的新固件拷贝至APPB_Flash存储区;否则OTA升级失败。将APPB_Flash存储区的旧固件拷贝至APPA_Flash存储区,清楚Patch_Flash存储区和相关OTA升级信息、

OTA升级测试

为验证基于LoRa通信的OTA升级的可靠性,搭建包括1个Master节点和10个Slave节点的测试环境。

  • Master节点由PC端电脑软件和LoRa透传模组组成
  • PC端电脑软件完成对Slave节点的OTA升级流程和协议控制,此外还制作patch文件
  • LoRa透传模组接口为USB转LoRa,负责将PC端电脑软件发出到USB口的数据转换成LoRa通信无线方式发送。

同步Master节点和Slave节点的LoRa跳频信道划分,配置默认信道为ch_1:472.5MHz,从472.7~465.1MHz,间隔0.2MHz,共计62个跳频信道。其余LoRa通信参数设置为带宽500kHz,编码率4/5、扩频因子12.为模拟信道冲突,10个SLAVE节点都在ch_1信道每隔10s随机发送业务数据。

Master节点选择测试用新固件new.bin,大小为31.2KB;旧固件old.bin,大小为33KB;依次执行固件分包、子包差分、子包压缩、patch文件拼包操作,生成patch补丁固件源文件。其中,固件按照扇区1KB进行分包,patch补丁固件源文件大小为2.3KB。

OTA传输的有效patch数据包设置为255字节,Master节点将patch补丁固件按照255字节分成10个数据包,每个数据包增加头文件信息OTA_header、整包数据量OTA_Size和sum32校验值,构成OTA数据包。

Master节点发送报文由Slave节点1的ID计算MD5值循环异或加密;默认信道472.5MHz发送广播报文,查询该Slave节点1的状态、固件版本号,发送OTA固件升级信息,并设置随机响应信道

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值