# FOTA升级 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 功能概述 FOTA(Firmware Over-The-Air)是远程固件升级能力,支持设备通过蜂窝网络自动下载并更新固件版本。开发者无需现场维护设备,即可远程完成版本升级、问题修复和功能迭代,有效降低运维成本并提升产品可靠性。 当前 FOTA 支持全量升级和差分升级两种模式。其中,全量升级通过下载完整固件包完成更新;差分升级仅传输版本差异数据,可显著减少升级包大小和网络流量消耗。升级过程中支持断点续传和升级状态反馈机制,确保升级过程安全、稳定、可靠。 ```{note} FOTA差分包和全量包均需配合对应工具使用,详情请参考 [FOTA工具使用教程](../../%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/FOTA%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/FOTA%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.md#fota工具使用教程)。 ``` 该功能适用于大规模物联网设备部署场景,可实现设备全生命周期的软件维护和版本管理。 # FOTA升级API ## 头文件 *qosa_fota.h* ## 函数概览 | **函数** | **说明** | | --- | --- | | *qosa_fota_init()* | 初始化FOTA并获取FOTA处理器句柄 | | *qosa_fota_deinit()* | 释放并销毁FOTA相关资源,停止并清理后台工作 | | *qosa_fota_set_update_urc_num()* | 设置升级所需的URC(通知)的数量 | | *qosa_fota_get_current_file_size()* | 查询当前已下载的FOTA包文件大小(用于断点续传/进度) | | *qosa_fota_verify_image()* | 对已下载的FOTA包进行完整性/签名校验 | | *qosa_set_fota_verify_config()* | 设置FOTA包签名验证配置(是/否) | | *qosa_get_fota_verify_config()* | 获取FOTA包签名验证配置(是/否) | | *qosa_fota_get_partition_space()* | 获取分区空间大小,检查是否满足FOTA包写入要求 | | *qosa_fota_write_packet_data()* | FOTA数据包写入 | | *qosa_fota_set_packname()* | 配置FOTA包名称 | | *qosa_fota_get_default_packname()* | 获取当前配置的FOTA包名称 | | *qosa_fota_set_opt()* | 配置FOTA选项 | | *qosa_fota_flag_set()* | 设置升级标志 | ## 函数详解 ### qosa_fota_init - **功能描述** 初始化FOTA并获取FOTA处理器句柄。 - **函数原型** ```c qosa_fota_t *qosa_fota_init(char *fota_name, qosa_bool_t del_old_file) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fota_name* | 输入 | char * | 设置FOTA包名称 | | *del_old_file* | 输入 | qosa_bool_t | 是否删除UFS下的历史文件
*QOSA_TRUE*:删除历史文件
*QOSA_FALSE*:不删除历史文件 | - **返回值说明** *qosa_fota_t **:FOTA处理器句柄 *QOSA_NULL*:函数执行失败 ### qosa_fota_deinit - **功能描述** 释放并销毁FOTA相关资源,停止并清理后台工作。 - **函数原型** ```c void qosa_fota_deinit(qosa_fota_t *fota) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fota* | 输入 | qosa_fota_t * | 与初始化操作相对应的FOTA句柄 | - **返回值说明** 无 ### qosa_fota_set_update_urc_num - **功能描述** 设置升级所需的URC(通知)的数量。 - **函数原型** ```c qosa_fota_errno_e qosa_fota_set_update_urc_num(qosa_fota_t *fota, qosa_uint8_t update_urc_num) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fota* | 输入 | qosa_fota_t * | 与初始化操作相对应的FOTA句柄 | | *update_urc_num* | 输入 | qosa_uint8_t | 设置URC的数量 | - **返回值说明** *QOSA_FOTA_OK*:函数执行成功 其他值:函数执行失败 ### qosa_fota_get_current_file_size - **功能描述** 查询当前已下载的FOTA包文件大小(用于断点续传/进度)。 - **函数原型** ```c qosa_int64_t qosa_fota_get_current_file_size(qosa_fota_t *fota) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fota* | 输入 | qosa_fota_t * | 与初始化操作相对应的FOTA句柄 | - **返回值说明** 返回当前文件的大小 ### qosa_fota_verify_image - **功能描述** 对已下载的FOTA包进行完整性/签名校验。 - **函数原型** ```c qosa_fota_errno_e qosa_fota_verify_image(qosa_fota_t *fota) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fota* | 输入 | qosa_fota_t * | 与初始化操作相对应的FOTA句柄 | - **返回值说明** *QOSA_FOTA_OK*:函数执行成功 其他值:函数执行失败 ### qosa_set_fota_verify_config - **功能描述** 设置FOTA包签名验证配置(是/否)。 - **函数原型** ```c qosa_fota_errno_e qosa_set_fota_verify_config(qosa_fota_verify_control_e value) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *value* | 输入 | *qosa_fota_verify_control_e* | *QOSA_FOTA_VERIFY_ENABLE*:启用FOTA签名验证
*QOSA_FOTA_VERIFY_DISABLE*:禁用FOTA签名验证 | - **返回值说明** *QOSA_FOTA_OK*:函数执行成功 其他值:函数执行失败 ### qosa_get_fota_verify_config - **功能描述** 获取FOTA包签名验证配置(是/否)。 - **函数原型** ```c qosa_fota_verify_control_e qosa_get_fota_verify_config(void) ``` - **返回值说明** *QOSA_FOTA_VERIFY_ENABLE*:签名验证已启用 *QOSA_FOTA_VERIFY_DISABLE*:签名验证已禁用 ### qosa_fota_get_partition_space - **功能描述** 获取分区空间大小,检查是否满足FOTA包写入要求。 - **函数原型** ```c qosa_int64_t qosa_fota_get_partition_space(qosa_fota_t *fota) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fota* | 输入 | qosa_fota_t * | 与初始化操作相对应的FOTA句柄 | - **返回值说明** qosa_int64_t类型,成功时表示实际空间的大小 失败返回 *-1* ### qosa_fota_write_packet_data - **功能描述** FOTA数据包写入。 - **函数原型** ```c qosa_fota_errno_e qosa_fota_write_packet_data(qosa_fota_t *fota, qosa_uint8_t *payload, qosa_size_t payload_len) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fota* | 输入 | qosa_fota_t * | 与初始化操作相对应的FOTA句柄 | | *payload* | 输入 | qosa_uint8_t * | 升级数据内容 | | *payload_len* | 输入 | qosa_size_t | 升级数据长度 | - **返回值说明** *QOSA_FOTA_OK*:函数执行成功 其他值:函数执行失败 ### qosa_fota_set_packname - **功能描述** 配置FOTA包名称。 - **函数原型** ```c qosa_fota_errno_e qosa_fota_set_packname(char *packetname, int length) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *packetname* | 输入 | char * | FOTA包名称 | | *length* | 输入 | int | FOTA包名称的长度 | - **返回值说明** *QOSA_FOTA_OK*:函数执行成功 其他值:函数执行失败 ### qosa_fota_get_default_packname - **功能描述** 获取当前的FOTA包名称。 - **函数原型** ```c qosa_fota_errno_e qosa_fota_get_default_packname(char *packetname, int *length) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *packetname* | 输出 | char * | 当前的FOTA包名称 | | *length* | 输出 | int * | 当前FOTA包名称的长度 | - **返回值说明** *QOSA_FOTA_OK*:函数执行成功 其他值:函数执行失败 ### qosa_fota_set_opt - **功能描述** 配置FOTA选项。 - **函数原型** ```c qosa_fota_errno_e qosa_fota_set_opt(qosa_fota_opt_cmd_e cmd, void *param) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *cmd* | 输入 | *qosa_fota_opt_cmd_e* | FOTA选项:
*QOSA_FOTA_OPT_CMD_SET_FOTA_MODE* 代表配置FOTA升级方式 | | *param* | 输入 | void * | 具体指令:
例:当cmd为:*QOSA_FOTA_OPT_CMD_SET_FOTA_MODE* 时,
*QOSA_FOTA_DFOTA_MODE* 代表差分升级
*QOSA_FOTA_FULL_MODE* 代表全量升级 | - **返回值说明** *QOSA_FOTA_OK*:函数执行成功 其他值:函数执行失败 ### qosa_fota_flag_set - **功能描述** 设置升级标志。 - **函数原型** ```c void qosa_fota_flag_set(void) ``` ## 枚举定义 ### qosa_fota_errno_e 结果码枚举定义如下: ```c typedef enum{ QOSA_FOTA_OK = 0, QOSA_FOTA_OPEN_ERROR = -1, QOSA_FOTA_WRITE_ERROR = -2, QOSA_FOTA_READ_ERROR = -3, QOSA_FOTA_ERASE_ERROR = -4, QOSA_FOTA_COMPARE_ERROR = -5, QOSA_FOTA_SEEK_ERROR = -6, QOSA_FOTA_UPDATE_ERROR = -7, QOSA_FOTA_PARAM_ERROR = -8, QOSA_FOTA_IMAGE_VERIFY_ERROR = -9, QOSA_FOTA_CODE_GENERAL_ERROR = -10, QOSA_FOTA_NOT_EXIST_ERROR = -11, QOSA_FOTA_OUT_OF_MEMORY = -12, QOSA_FOTA_PARTITION_ERROR = -13, QOSA_FOTA_CLOSE_ERROR = -14, QOSA_FOTA_RENAME_ERROR = -15, QOSA_FOTA_BUF_NOT_ENOUGH = -16, QOSA_FOTA_FLASH_READ_ERROR = -17, QOSA_FOTA_FLASH_WRITE_ERROR = -18, QOSA_FOTA_FLASH_ERASE_ERROR = -19, QOSA_FOTA_VERIFY_NOT_ENABLE = -20, QOSA_FOTA_NOT_SUPPORT_ERROR = -21, } qosa_fota_errno_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_FOTA_OK* | FOTA执行成功 | | *QOSA_FOTA_OPEN_ERROR* | FOTA文件打开错误 | | *QOSA_FOTA_WRITE_ERROR* | FOTA数据写入错误 | | *QOSA_FOTA_READ_ERROR* | FOTA数据读取错误 | | *QOSA_FOTA_ERASE_ERROR* | FOTA擦除失败 | | *QOSA_FOTA_COMPARE_ERROR* | FOTA对比失败 | | *QOSA_FOTA_SEEK_ERROR* | FOTA检测错误 | | *QOSA_FOTA_UPDATE_ERROR* | 升级失败 | | *QOSA_FOTA_PARAM_ERROR* | 输入参数错误 | | *QOSA_FOTA_IMAGE_VERIFY_ERROR* | FOTA包校验失败 | | *QOSA_FOTA_CODE_GENERAL_ERROR* | FOTA升级内部错误 | | *QOSA_FOTA_NOT_EXIST_ERROR* | 文件不存在 | | *QOSA_FOTA_OUT_OF_MEMORY* | 内存不足 | | *QOSA_FOTA_PARTITION_ERROR* | 分区错误 | | *QOSA_FOTA_CLOSE_ERROR* | 关闭失败 | | *QOSA_FOTA_RENAME_ERROR* | 重命名失败 | | *QOSA_FOTA_BUF_NOT_ENOUGH* | 缓冲区不足 | | *QOSA_FOTA_FLASH_READ_ERROR* | FLASH数据读取失败 | | *QOSA_FOTA_FLASH_WRITE_ERROR* | FLASH数据写入失败 | | *QOSA_FOTA_FLASH_ERASE_ERROR* | FLASH数据擦除失败 | | *QOSA_FOTA_VERIFY_NOT_ENABLE* | FOTA包校验未开启 | | *QOSA_FOTA_NOT_SUPPORT_ERROR* | 不支持 | ### qosa_fota_verify_control_e FOTA签名枚举定义如下: ```c typedef enum{ QOSA_FOTA_VERIFY_NOT_SUPPORT = -1, QOSA_FOTA_VERIFY_DISABLE = 0, QOSA_FOTA_VERIFY_ENABLE = 1, } qosa_fota_verify_control_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_FOTA_VERIFY_NOT_SUPPORT* | 不支持FOTA签名验证 | | *QOSA_FOTA_VERIFY_DISABLE* | 禁用FOTA签名验证 | | *QOSA_FOTA_VERIFY_ENABLE* | 启用FOTA签名验证 | ### qosa_fota_opt_cmd_e 枚举定义如下: ```c typedef enum{ QOSA_FOTA_OPT_CMD_SET_FOTA_MODE = 0, } qosa_fota_opt_cmd_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_FOTA_OPT_CMD_SET_FOTA_MODE* | 设置FOTA升级方式 | ### qosa_fota_mode_e 枚举定义如下: ```c typedef enum{ QOSA_FOTA_DFOTA_MODE = 0, QOSA_FOTA_FULL_MODE, } qosa_fota_mode_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_FOTA_DFOTA_MODE* | 差分升级 | | *QOSA_FOTA_FULL_MODE* | 全量升级 | # 应用逻辑流程图 ## 升级流程 ```{image} images/board_T8nBwUG4eh40Qpb7SstcLqzHnsf.jpg :width: 691px :height: 950px :align: center ``` # 示例代码 完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/system/fota/http_fota_demo.c https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/system/fota/ftp_fota_demo.c