本工具是基于 RT-Thread OTA 固件打包工具的命令行版本,使用 Python 编写。它支持将固件文件打包成 RBL (RT-Thread Boot Loader) 格式,可用于 RT-Thread 系统的 OTA 升级。
主要特点:
- 支持多种压缩和加密方式
- 不压缩|不加密
- 不压缩|AES256加密
- GZIP压缩|不加密
- GZIP压缩|AES256加密
- 支持配置文件和命令行参数混合使用
- 支持自动化打包,便于批量处理
- 提供打包好的可执行文件,方便在 Windows 环境使用
-
环境要求:
- Python 3.9 或更高版本
- 安装依赖:
pip install pycryptodome
-
配置文件方式:
python Package.py -c config.json
-
命令行参数方式:
# 使用配置文件并覆盖固件版本 python Package.py -c config.json --FirmwareVersion 2.2.3 # 同时指定多个参数 python Package.py -c config.json --FirmwareVersion 2.2.3 --FirmwarePartitionName app2
打包好的 rt_ota_pack_cmd.exe 使用方法与 Python 脚本相同:
# 仅使用配置文件
rt_ota_pack_cmd.exe -c config.json
# 使用配置文件并覆盖参数
rt_ota_pack_cmd.exe -c config.json --FirmwareVersion 2.2.3所有参数都支持通过配置文件和命令行指定,命令行参数优先级高于配置文件:
-c, --config:指定配置文件路径,默认为./config.json--FirmwarePath:固件文件路径--RBLPath:输出RBL文件路径--CompressionEncryptionAlgorithm:压缩和加密算法RT_OTA_CRYPT_ALGO_NONE:不压缩不加密RT_OTA_CRYPT_ALGO_AES256:AES256加密RT_OTA_CMPRS_ALGO_GZIP:GZIP压缩RT_OTA_CMPRS_ALGO_GZIP_AES256:GZIP压缩+AES256加密
--EncryptionKey:AES256加密密钥(32字节)--EncryptionIV:AES256加密初始向量(16字节)--FirmwarePartitionName:固件分区名称--FirmwareVersion:固件版本
{
"FirmwarePath": "./test.bin",
"RBLPath": "./test_cmd.rbl",
"CompressionEncryptionAlgorithm": "RT_OTA_CMPRS_ALGO_GZIP_AES256",
"EncryptionKey": "0123456789ABCDEF0123456789ABCDEF",
"EncryptionIV": "0123456789ABCDEF",
"FirmwarePartitionName": "app",
"FirmwareVersion": "1.0.1"
}本项目提供了 Windows 环境下的自动打包脚本 build.bat,它会:
- 创建 Python 虚拟环境(如果不存在)
- 安装所需依赖(requirements.txt)
- 使用 PyInstaller 打包成单文件可执行程序
使用方法:
# 直接运行 build.bat 即可
build.bat打包完成后,可执行文件 rt_ota_pack_cmd.exe 将生成在 dist 目录下。
RBL 文件由 96 字节的文件头和后续的固件数据组成。文件头结构如下:
typedef struct {
char type[4]; // RBL 字符头
rt_uint16_t fota_algo; // 算法配置:加密/压缩算法标识
rt_uint8_t fm_time[6]; // 原始 bin 文件时间戳
char app_part_name[16]; // app 执行分区名
char download_version[24]; // 固件代码版本号
char current_version[24]; // 当前运行的固件版本号
rt_uint32_t code_crc; // 打包后代码的 CRC32 校验值
rt_uint32_t hash_val; // 原始代码的 FNV1a 哈希值
rt_uint32_t raw_size; // 原始代码大小
rt_uint32_t com_size; // 打包后代码大小
rt_uint32_t head_crc; // 文件头的 CRC32 校验值
} rt_fota_part_head;本工具使用 Python 的 gzip 模块进行压缩,压缩等级设置为 6,与官方工具效果相同。为了保持与官方工具的兼容性,工具会自动修正 GZIP 文件头中的以下字段:
- MTIME:设置为 0
- XFL:设置为 4(表示最快压缩算法)
- OS:设置为 0(表示 FAT 文件系统)
- RT-Thread Qboot:在 ART-PI H750 开发板上经过测试的 bootloader
- RT-FOTA:基于 STM32 的开源 Bootloader 框架
- STM32 通用 Bootloader&OTA:官方参考文档
-
在使用 AES256 加密时,请确保:
- 加密密钥(EncryptionKey)长度为 32 字节
- 初始向量(EncryptionIV)长度为 16 字节
-
建议优先使用"不压缩|AES256加密"配置,因为某些 bootloader 的解压功能可能存在兼容性问题。
-
命令行参数会覆盖配置文件中的相同参数,可以灵活组合使用。
-
使用 GZIP 压缩时,本工具已经处理了与官方工具的兼容性问题,可以放心使用。
-
推荐搭配 RT-Thread Qboot 使用,该版本已在多个平台上验证通过。