RT-Thread OTA 固件升级
本文主要介绍在 RT-Thread 系统上进行固件升级的工具和方法。固件升级,通常也称为 OTA(Over the Air)升级或者 FOTA(Firmware Over-The-Air)升级,即固件通过空中下载进行升级的技术。
网络协议
Ymodem 协议
Ymodem 是一种文本传输协议,在 OTA 应用中为空中下载技术提供文件传输的支持。基于 Ymodem 协议的固件升级即为 OTA 固件升级的一个具体应用实例。
HTTP 协议
HTTP 是一种超文本传输协议,采用请求应答的通讯模式,可以基于通用 socket 实现极简客户端程序,广泛应用在互联网上。HTTP 请求应答的方式,及其很小的客户端代码量,也使其很方便地应用在物联网设备中,用于与服务器进行数据交互,以及 OTA 固件下载。
Flash 分区
通常嵌入式系统程序是没有文件系统的,而是将 Flash 分成不同的功能区块,从而形成不同的功能分区。
要具备 OTA 固件升级能力,通常需要至少有两个程序运行在设备上。其中负责固件校验升级的程序称之为 bootloader,另一个负责业务逻辑的程序称之为 app。它们负责不同的功能,存储在 Flash 的不同地址范围,从而形成了 bootloader 分区 和 app 分区 。
但多数情况下嵌入式系统程序是运行在 Flash 中的,下载升级固件的时候不会直接向 app 分区写入新的固件,而是先下载到另外的一个分区暂存,这个分区就是 download 分区 ,也有称之为 app2 分区 ,这取决于 bootloader 的升级模式。
bootloader 分区、app 分区、download 分区及其他分区一起构成了分区表。分区表标识了该分区的特有属性,通常包含分区名、分区大小、分区的起止地址等。
bootloader 升级模式
bootloader 的升级模式常见有以下两种:
1、bootloader 分区 + app1 分区 + app2 分区模式
该模式下,bootloader 启动后,检查 app1 和 app2 分区,哪个固件版本最新就运行哪个分区的固件。当有新版本的升级固件时,固件下 载程序会将新的固件下载到另外的一个没有运行的 app 分区,下次启动的时候重新选择执行新版本的固件。
- 优点:无需固件搬运,启动速度快。
- 缺点:app1 分区和 app2 分区通常要大小相等,占用 Flash 资源;且 app1 和 app2 分区都只能存放 app 固件,不能存放其他固件(如 WiFi 固件)。
2、bootloader 分区 + app 分区 + download 分区模式
该模式下,bootloader 启动后,检查 download 分区是否有新版本的固件,如果 download 分区内有新版本固件,则将新版本固件从 download 分区搬运到 app 分区,完成后执行 app 分区内的固件;如果 download 分区内没有新版本的固件,则直接执行 app 分区内的固件。
当有新版本的升级固件时,固件下载程序会将新的固件下载到 download 分区内,重启后进行升级。
- 优点:download 分区可以比 app 分区小很多(使用压缩固件),节省 Flash 资源,节省下载流量;download 分区也可以下载其他固件,从而升级其他的固件,如 WiFi 固件、RomFs。
- 缺点:需要搬运固件,首次升级启动速度略慢。
RT-Thread OTA 使用的是 bootloader 升级模式 2,即 bootloader 分区 + app 分区 + download 分区的组合。
固件下载器
在嵌入式设备程序中实现的,具有从远端下载升级固件功能的代码块称之为固件下载器(OTA Downloader)。固件下载器的工作是把新版本的升级固件下载设备的 Flash 中,不同的协议以及不同的 OTA 固件托管平台会有不同的固件下载器,即不同的代码实现。
目前 RT-Thread 已经支持了多种固件下载器 ,如下所示:
- 基于 Ymodem 协议的 Ymodem OTA 固件下载器(可通过串口等方式升级固件)
- 基于 HTTP 协议的 HTTP OTA 固件下载器(可通过网络方式升级固件)
- 基于特定云平台的 OTA 固件下载器
- RT-Cloud OTA 固件下载器(适配 RT-Cloud OTA 功能)
- ali-iotkit 固件下载器(适配阿里云 LinkDevelop 平台和 LinkPlatform 平台的 OTA 功能)
- Ayla 云 OTA 固件下载器(适配 Ayla 云平台的 OTA 功能)
- 其他第三方 OTA 托管平台(其他平台请联系 RT-Thread 团队)
RT-Thread OTA
RT-Thread OTA 是 RT-Thread 开发的跨 OS、跨芯片平台的固件升级技术,轻松实现对设备端固件的管理、升级与维护。 RT-Thread 提供的 OTA 固件升级技术具有以下优势:
- 固件防篡改:自动检测固件签名,保证固件安全可靠;
- 固件加密:支持 AES-256 加密算法,提高固件下载、存储安全性;
- 固件压缩:高效压缩算法,降低固件大小,减少 Flash 空间占用,节省传输流量,降低下载时间;
- 差分升级:根据版本差异生成差分包,进一步节省 Flash 空间,节省传输流量,加快升级速度;
- 断电保护:断电后保护,重启后继续升级;
- 智能还原:固件损坏时,自动还原至出厂固件,提升可靠性;
- 高度可移植:可跨 OS、跨芯片平台、跨 Flash 型号使用;
- 多可用的固件下载器:支持多种协议的 OTA 固件托管平台和物联网云平台。
RT-Thread OTA 框 架图如下所示:
从上面的 OTA 框架图可以发现,Ymodem 在 OTA 流程中充当的是 OTA Downloader(固件下载器)的角色,核心的 OTA 业务逻辑在 RT OTA 中,也就是封装到了 bootloader 固件里。OTA 业务逻辑与应用程序解耦,极大简化了 OTA 功能增加的难度。
OTA 升级流程
在嵌入式系统方案里,要完成一次 OTA 固件远端升级,通常需要以下阶段:
- 准备升级固件(RT-Thread OTA 使用特定的 rbl 格式固件),并上传 OTA 固件到固件托管服务器;
- 设备端使用固件托管服务器对应的固件下载器下载 OTA 升级固件;
- 新版本固件下载完成后,在适当的时候重启进入 bootloader;
- bootloader 对 OTA 固件进行校验、解密和搬运(搬运到 app 分区);
- 升级成功,执行新版本 app 固件。
OTA 升级流程如下图所示: