基于rtthread的OTA功能实现

文章结构:

  1. 摘要
  2. BootLoader的设计与实现
  3. App的设计与实现
  4. Firmware固件的打包、设计、实现与使用

第三章 Firmware固件的打包、设计、实现与使用

文章目录

  • 基于rtthread的OTA功能实现
  • 第三章 Firmware固件的打包、设计、实现与使用
    • 前言
    • 关键步骤
    • RBL打包器原理
    • 打包验证
    • 上传验证
    • 打包器的设计

前言

  在《App的设计与实现》一章中,编译器编译出来的应用程序rtthread.bin 属于原始固件,并不能用于 RT-Thread OTA的升级固件,需要用户使用 OTA 固件打包器 打包生成 .rbl 后缀名的固件,然后才能进行 OTA 升级。


关键步骤

可以根据需要,选择是否对固件进行加密和压缩,提供多种压缩算法和加密算法支持 ,基本操作步骤如下:

  1. 选择待打包的固件
  2. 选择生成固件的位置
  3. 选择压缩算法
  4. 选择加密算法
  5. 配置加密密钥(不加密则留空)
  6. 配置加密 IV (不加密则留空)
  7. 填写固件分区名
  8. 填写固件版本
  9. 开始打包
  10. OTA 升级

重要:

  • 加密密钥和 加密 IV 必须与 BootLoader 程序中的一致,否则无法正确加密固件
  • 固件打包过程中有 固件分区名 的填写,这里注意需要填入 Flash 分区表中对应分区的名称,不能有误
    (本文中应用程序区名称为 app)

RBL打包器原理

打包软件可以设置代码加密和压缩,其配置信息都存在rbl文件前96字节中:

rt-fota />fota show fm_area 0 96
00000000: 52 42 4C 00 00 02 00 00 5E A9 A4 5D 61 70 70 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 31 2E 30 2E
00000020: 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 31 2E 30 2E 36 00 00 00 00 00 00 00
00000040: 00 00 00 00 00 00 00 00 00 00 00 00 43 33 29 0A
00000050: 47 08 F6 DA 84 BB 00 00 1C 84 00 00 C4 3D E3 B5

typedef struct {char type[4];                 /* RBL字符头 */ rt_uint16_t fota_algo;        /* 算法配置: 表示是否加密或者使用了压缩算法 */rt_uint8_t fm_time[6];        /* 原始bin文件的时间戳, 6位时间戳, 使用了4字节, 包含年月日信息 */char app_part_name[16];       /* app执行分区名 */char download_version[24];    /* 固件代码版本号 */char current_version[24];     /* 这个域在rbl文件生成时都是一样的,用于表示app分区当前运行固件的版本号,判断是否固件需要升级 */rt_uint32_t code_crc;         /* 代码的CRC32校验值,它是的打包后的校验值,即rbl文件96字节后的数据 */rt_uint32_t hash_val;         /* 估计这个域是指的原始代码本身的校验值 */rt_uint32_t raw_size;         /* 原始代码的大小 */rt_uint32_t com_size;         /* 打包代码的大小 */rt_uint32_t head_crc;         /* rbl文件头的CRC32校验值,即rbl文件的前96字节 */} rt_fota_part_head, *rt_fota_part_head_t;

打包验证

将《App的设计与实现》一章中生成的app应用程序文件rtthread.bin文件进行打包,打包信息图如图所示,为了方便验证我们将app1.0.1不加密,app1.0.2进行压缩解密(压缩算法:fastlz,加密算法AES256,加密秘钥和加密IV如图所示)

提示: 当使用打包器对app应用程序进行打包时,加密秘钥必须和设计BootLoader的密钥和key值相对应。

图示即为《BootLoader的设计与实现》一章中设定的加密密钥和key值,其值定义在rtconfig.h文件中。


上传验证

  1. 系统启动后BootLoader界面及打印信息,敲入回车按键,暂停BootLoader自启。

  1. 在终端中输入“ymodem_ota”命令,执行固件升级程序。

  1. 下载完毕后,系统重启,重新进入BootLoader进行固件程序引导。

    可以看到BootLoader首先对app分区进行了擦除动作,然后释放新的固件程序到app分区,最后完成程序的跳转动作。当前的固件版本信息为1.0.1。

  1. 在终端中输入“reboot”命令,系统重启,重新进入BootLoader,敲入回车按键,暂停BootLoader自启,这里我们验证固件的恢复出厂设置功能和更新功能。

  1. 在终端中输入“qboot clone download fa

  1. 在终端中输入“ymodem_ota”命令,执行固件升级程序。将app1.0.2版本的固件更新到系统中。

  1. 系统启动后会打印固件app1.0.2的版本信息。

  1. 重新回到BootLoader界面下,在终端中输入“qboot probe”命令,打印当前系统app分区和factory分区所存储的固件信息。

    说明:如图所示,当前app分区中存储的固件版本为1.0.2,使用了AES加密和fastlz压缩算法,factory分区中存储的固件版本为1.0.1,未使用加密和压缩算法。固件的CRC校验值和大小分别和打包器打包后的数值一一对应。

  1. 总结:至此,全流程的OTA固件升级动作已经全部完成,如果需要恢复出厂固件,可以使用“qboot clone factory download”命令,将factory分区固件复制到“download”分区,这样系统重启后就会自动将固件版本更新到1.0.1版本。


打包器的设计

在RT-Thread社区提供的打包工具rt_ota_packaging_tool.exe涉及到了fnv1a_r加密HASH算法的设定,因此是闭源的。基于对开源精神的崇拜和RT-Thread多年的感情,本人仿制一套新的打包工具,其在功能设定上与rt_ota_packaging_tool一致,现将其开放出来供大家学习借鉴(源码已上传至个人github:https://github.com/refugeer/rt_thread_ota)。
打包工具采用c#语言实现,基于Visual Studio 2019 开发。其关于hash的部分的关键算法如下:

 public class fnv1a{public const uint FNV_SEED = 2166136261u;public static uint fnv1a_r(byte oneByte, uint hash){return (oneByte ^ hash) * 16777619;}public static uint calc(byte[] data, uint hash){for (int i = 0; i < data.Length; i++){hash = fnv1a_r(data[i], hash);}return hash;}

说明: 压缩部分调用fastlz.dll和quicklz150_32_3.dll实现,这里不在一一赘述,如需更多详情请下载C#源码了解。
警告: 加密算法涉及到商业产品应用的核心流程,仅作为个人学习研究和非商业用途,请务必传播和用于不正当竞争环节,因此造成的商业纠纷由个人承担,本人概不负责。

Firmware固件的打包、设计、实现与使用相关推荐

  1. 【SA8295P 源码分析】44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件

    [SA8295P 源码分析]44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件 1.提取 NON-HLOS.bin 中的 Wifi Firmware 出来 2.把提取 ...

  2. a10 linux 烧写,全志 A10 A20 A31 A13固件配置,打包,烧写指南.pdf

    全志 A10 A20 A31 A13固件配置,打包,烧写指南 SPR 用户手册 SPR 用户手册 Vers Data Author Change Description ion V1.00 2011- ...

  3. hikvision firmware/固件 upgrade WI for IP camera

    hikvision firmware/固件 upgrade WI for IP camera Firmware download page: http://www1.hikvision.com/cn/ ...

  4. Firmware固件提取及分析技术

    概念 固件(firmware)是一种写入硬件设备的软件,作用是对应用和各项系统功能实时控制.固件中包含底层代码,这些代码能实现软件对硬件的操作.运行固件的设备称为嵌入式系统,嵌入式系统的硬件资源在存储 ...

  5. 模块开发卷宗是什么_详论单片机固件模块化架构设计(精华)

    [导读] 为什么写本文?做公号两月,遇到一些初学单片机的同学,刚刚入手做单片机开发,还没有涉及到使用RTOS,且刚入手直接上RTOS可能会有些难度,有的使用的相对较老单片机资源还有限,也不适合跑RTO ...

  6. gradle多版本打包设计

    一. 打包简介 android的打包系列有:ant打包(eclipse),gradle打包(Android-studio)和python打包(美团打包方式)等.这里主要介绍gradle打包,通过设置b ...

  7. firmware linux 解包_官改固件解包打包 - 斐讯无线路由器以及其它斐迅网络设备 - 恩山无线论坛 - Powered by Discuz!...

    本帖最后由 eaglepeng 于 2020-3-11 15:23 编辑 前段时间想重新修改下官改固件logo,找到了一份Linux下简单的解包打包工具,后来在逛帖子看到另一个工具.现总结如下,需要的 ...

  8. 固件firmware和驱动driver

    目录 驱动driver 固件firmware firmware 出现的背景 为什么还需要驱动 什么是 firmware 固件的存储介质/载体 如何将固件写入到硬件 固件升级 其他 区别与联系 参考 驱 ...

  9. [ROC-RK3568-PC] 手把手教你编译Linux_SDK并打包Buildroot系统固件

    ✏️ROC-RK3568-PC入门篇连载进程: ✅ [ROC-RK3568-PC] 手把手教你把出厂的Android系统烧写为Ubuntu系统 ✅ [ROC-RK3568-PC] 手把手教你制作Ubu ...

最新文章

  1. 56.阶乘因式分解(一)
  2. 多元统计第二章证明题_2020年中南大学应用统计硕士考研成功经验分享
  3. 几种常见光端机的作用介绍
  4. mobile cpu上禁用alpha test的相关总结
  5. CSS 小结笔记之滑动门技术
  6. 移动混合应用HTML5数据查询优化
  7. ora optimizer
  8. Smoothy将于4月22日-27日在BSCPad等4个平台进行IDO
  9. 《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数...
  10. 基于springboot的民办职业学校缴费系统
  11. Linux命令之last
  12. Android自定义View之滑杆内部带数字的SeekBar
  13. xxx was compiled with optimization - stepping may behave oddly; variables may not be available.
  14. 计算机公开课课前互动小游戏,幼儿园10个师幼互动小游戏 让你的课堂马上活跃嗨起来!...
  15. Oracle SQL开发考试试题
  16. ROG 幻16无线网卡驱动无法更新
  17. 进入路由器linux系统时间长,如何用linux做路由器限速
  18. zookeeper开源客户端Curator介绍(六)
  19. quest3d通道英汉对照部分
  20. 从零学习Jenkins部署SpringBoot项目

热门文章

  1. 微信ipad协议稳定版826的底层逻辑
  2. Opengl使用手册 | 图形学快速入门
  3. 浏览器查看cookie过期时间
  4. 西门子培训2——OID
  5. leetCode(GO)
  6. 美元下跌加速多头反攻 黄金收涨成功突破1800
  7. Navicat Premium for Mac 11.1.8 中文破解版
  8. access下如何配置两个vlan_VLAN实验一:VLAN基础配置及Access接口
  9. web中转服务器,Web服务器
  10. 回声消除原理 此博文包含图片