在OTA升级时,需要从网络下载OTA包,并写到flash上的对应分区中。

最简单的方式是将下载与更新分离,先将完整的数据包下载到本地,再将本地的OTA包更新到flash上。方便可靠。

但这种方式的问题是,本地需要有足够的空间存放OTA包,这对一些flash较小的产品来说,会起到很大的限制作用,需要在flash上留出一个不小于系统占用大小的空间,用于存放OTA包。

但空间确实不够啊,怎么办呢?这个时候就需要能支持流式更新了,让从网络下载的数据,直接写到flash中。

安卓在AB升级方案中,就支持了这种流式更新(streaming updates)的方式,无需临时空间存放OTA包。

那么具体怎么实现了,其实流式更新最简单的实现,只需几行shell脚本,调用外部现成的工具,通过管道的形式配合即可实现。

例如使用wget下载ota包的话,则可以使用 wget 的 -S 参数,滤出OTA包的长度

    file_length=$(wget -S "$file_download" 2>&1 | grep "Content-Length" | awk '{print $2}')

再通过wget与dd相配合,将数据直接写入对应分区。

 wget "$file_download" -q -O - | dd of="$partition"

最后再下载md5校验值,并将写入的数据流式读出,同样通过管道传给md5sum,算出校验值进行校验。

 md51=$(wget "$file_download.md5" -q -O -)
 md52=$(dd if="$partition" bs=512 count="$file_sectors" | md5sum | cut -d ' ' -f 1)

以上就是使用shell脚本,调用wget,dd,md5sum ,使用管道进行配合,完成的流式更新的核心部分了。

相关文章:

  • 2021-11-11
  • 2021-12-27
  • 2022-01-07
  • 2022-12-23
猜你喜欢
  • 2022-01-04
  • 2021-07-12
  • 2021-12-22
  • 2021-04-07
  • 2021-09-19
  • 2021-07-25
相关资源
相似解决方案