文档中心>物联网智能视频服务(消费版)

固件升级模块

最近更新时间:2021-06-23 10:18:27

我的收藏

功能介绍

本模块用于设备在线升级操作。用户使用本模块实现数据设备固件在线检查升级,本模块提供下载后的升级包,升级包写入设备操作由用户实现。

流程指引

主流程

注册 OTA 固件更新回调 > OTA 模块初始化 > OTA 模块去初始化

升级流程

收到固件更新回调 > 开始将固件数据写 flash > 发送固件更新进度

接口参考

该功能模块提供以下接口:
iv_ota_init:OTA 模块初始化。
iv_ota_exit:OTA 模块去初始化。
iv_ota_firmware_update_cb:固件更新回调。
iv_ota_update_progress:固件升级进度。
iv_ota_get_firmware_save_name_cb:SDK 获取本地存储 OTA 固件完整路径文件名回调。

iv_ota_init

接口描述
OTA 模块初始化。
int iv_ota_init(iv_ota_init_parm_s *pstInitParm)
参数说明
参数名称
类型
描述
输入/输出
pstInitParm
iv_ota_init_parm_s *
OTA 模块初始化参数
输入
返回值
返回值
描述
IV_ERR_NONE
成功
IV_ERR_*
失败,对应相应错误码

iv_ota_exit

接口描述
OTA 模块去初始化。
int iv_ota_exit(void);
参数说明
返回值
返回值
描述
IV_ERR_NONE
成功
IV_ERR_*
失败,对应相应错误码

iv_ota_firmware_update_cb

接口描述
固件更新回调。此接口由 SDK 回调给应用层,携带已经下载固件所保存文件的路径,文件长度信息,所更新的固件保存在内存中,应用层在收到此回调后使用本文件进行升级操作。
int (* iv_ota_firmware_update_cb)(int8_t *pFirmwarePath, uint64_t u32FirmwareLen);
参数说明
参数名称
类型
描述
输入/输出
pFirmwarePath
int8_t *
固件绝对路径
输入
u32FirmwareLen
uint64_t
固件大小
输入
返回值
返回值
描述
IV_ERR_NONE
成功
IV_ERR_*
失败,对应相应错误码

iv_ota_update_progress

接口描述 固件升级的进度。
int iv_ota_update_progress(int value);
参数说明
参数名称
类型
描述
输入/输出
value
int
更新进度值:
[-30,30]为 SDK 内存使用。 [-30,0]表示下载过程中的错误,详见 iv_ota_progress_e, [0,30]对应下载进度[0,100]
其他值为用户可自定义使用
输入
返回值
返回值
描述
IV_ERR_NONE
成功
IV_ERR_*
失败,对应相应错误码

iv_ota_get_firmware_save_name_cb

接口描述
1. SDK 在下载固件时从应用层获取固件下载存储在本地的完整路径文件名。如果提供的路径是可用的则会存储在该路径,如果该路径不可用则会通过 iv_ota_update_progress 传输错误到 App 端。
2. 如果应用层不想指定该路径,则无需注册该回调函数,SDK 会根据系统初始化时传入的 cache 路径 iv_sys_init->stSysInitParameters.s8PubCachePath 来合成最后固件存储的完整路径。
3. 如非必要建议不设置该回调。
int32_t (* iv_ota_get_firmware_save_name_cb)(uint8_t firmware_name[IV_OTA_LOCAL_FILE_NAME_MAX_LEN],uint32_t name_buff_len);
参数说明
参数名称
类型
描述
输入/输出
firmware_name
uint8_t*
完整的文件名及其绝对路径 eg:/temp/app_upg.bin
输出
name_buff_len
uint32_t
firmware_name buff 的最大长度,文件路径不可超过该限制
输入
返回值
返回值
描述
IV_ERR_NONE
成功
IV_ERR_*
失败,对应相应错误码

数据结构

该模块提供以下数据结构:
iv_ota_init_parm_s:OTA 模块初始化参数结构体。
iv_ota_progress_e:OTA 模块升级时的进度和错误枚举。

iv_ota_init_parm_s

OTA 模块初始化参数结构体。
typedef struct iv_ota_init_parm_s
{
/* start update firmware callback */
void (* iv_ota_firmware_update_cb)(char * firmware_name, uint64_t firmware_len);
/* get local firmware file full path name of ota downlaod save */
int32_t (* iv_ota_get_firmware_save_name_cb)(uint8_t firmware_name[IV_OTA_LOCAL_FILE_NAME_MAX_LEN],uint32_t name_buff_len);
}iv_ota_init_parm_s;
参数说明
成员名称
描述
取值
iv_ota_firmware_update_cb
开始更新固件回调
iv_ota_get_firmware_save_name_cb
获取下载ota固件存储全路径回调(非必要注册)

iv_ota_progress_e

OTA 模块升级时的进度和错误枚举。
typedef enum iv_ota_progress_e{

/* custom: <-30 */
/*
IV_OTA_ERR_UPGRADE_*
*/
/* download progress err : sdk set[-30,0) */
IV_OTA_FILE_SIZE_TOO_SAMLL = -1,
IV_OTA_FILE_SIZE_TOO_BIG = -2,
IV_OTA_FILE_SAVE_FAIL = -3,
IV_OTA_FILE_CREATE_FAIL = -4,
IV_OTA_URL_NOT_EXIST = -5,
IV_OTA_CONNECT_SERVER_FAIL = -6,
IV_OTA_REQUEST_DOWNLOAD_FAIL = -7,
IV_OTA_FILE_DOWNLOAD_TIME_OUT = -8,
IV_OTA_APP_REJECT_UPGRADE = -9,
IV_OTA_MODULE_BUSY = -10,
IV_OTA_MODULE_EXIT = -11,
/* download progress: sdk set[0,30]->file download[0%,100%] */
IV_OTA_FILE_DOWNLOAD_0 = 0,
/*
IV_OTA_FILE_DOWNLOAD_progress....
*/
IV_OTA_FILE_DOWNLOAD_100 = 30,/
/* custom: >30 */
/*
IV_OTA_FILE_UPGRADE_*
*/
}iv_ota_progress_e;
参数说明
成员名称
描述
取值
IV_OTA_ERR_UPGRADE_
其他升级错误
<-30
IV_OTA_FILE_SIZE_TOO_SAMLL
OTA 文件下载不完整,和预期长度不符,过小
-1
IV_OTA_FILE_SIZE_TOO_BIG
OTA 文件下载出错,和预期长度不符,过大
-2
IV_OTA_FILE_SAVE_FAIL
保存本地 OTA 文件失败(需要检查空间是否充裕)
-3
IV_OTA_FILE_CREATE_FAIL
创建 OTA 文件失败(需要检查目录是否可写)
-4
IV_OTA_URL_NOT_EXIST
OTA 文件 URL 不存在(是否预先进行了升级检查,是否有更新的版本可供更新)
-5
IV_OTA_CONNECT_SERVER_FAIL
连接 OTA 文件资源服务器失败
-6
IV_OTA_REQUEST_DOWNLOAD_FAIL
请求下载 OTA 文件失败
-7
IV_OTA_FILE_DOWNLOAD_TIME_OUT
长时间未收到新的数据(socket 读超时)
-8
IV_OTA_APP_REJECT_UPGRADE
应用层拒绝了本次升级
-9
IV_OTA_MODULE_BUSY
OTA 模块忙无法进行升级
-10
IV_OTA_MODULE_EXIT
OTA 模块已经退出无法进行升级
-11
IV_OTA_FILE_DOWNLOAD_0
文件开始下载
0
IV_OTA_FILE_DOWNLOAD_100
文件下载成功
30
IV_OTA_FILE_UPGRADE_
文件升级的进度
>30

代码示例

1. OTA 模块初始化

iv_err_code_e eErrCode = 0;
iv_ota_init_parm_s stUpgradeInitParm;
memset(&stUpgradeInitParm,0,sizeof(iv_ota_init_parm_s));
stUpgradeInitParm.iv_ota_firmware_update_cb = upgrade_firmware_update;
stUpgradeInitParm.iv_ota_get_firmware_save_name_cb = get_firmware_save_name;

eErrCode = iv_ota_init(&stUpgradeInitParm);
if(eErrCode < 0)
{
GDB_INFO("fail:%d.\\n",eErrCode);
return eErrCode;
}

2. OTA 模块去初始化

iv_err_code_e eErrCode = 0;
eErrCode = iv_ota_exit();
if(eErrCode < 0)
{
GDB_INFO("fail:%d.\\n", eErrCode);
return eErrCode;
}


3. OTA 升级

void upgrade_firmware_update(char *pFirmwarePath, uint64_t u32FirmwareLen)
{
/*read firmware data and write flash*/
FILE *fpFirmware = NULL;
fpFirmware = fopen(pFirmwarePath, "rb");
if(!fpFirmware)
{
GDB_ERR("fopen %s fail.\\n", pFirmwarePath);
iv_ota_update_progress(IV_OTA_PROGRESS_TYPE_FAIL, IV_OTA_FAIL_TYPE_OPEN_FILE);
return;
}

fseek(fpFirmware, 0, SEEK_END);
if(u32FirmwareLen != ftell(fpFirmware))
{
GDB_ERR("%s real size is wrong, u32FirmwareLen:%lld, fileLen:%ld.\\n", pFirmwarePath, u32FirmwareLen, ftell(fpFirmware));
iv_ota_update_progress(IV_OTA_PROGRESS_TYPE_FAIL, IV_OTA_FAIL_TYPE_WRONG_SIZE);
fclose(fpFirmware);
fpFirmware = NULL;
return;
}
/*执行升级...*/
/*发送升级进度*/
fclose(fpFirmware);
usleep(600000);
fpFirmware = NULL;
/*demo模拟升级进度*/
iv_ota_update_progress(50);
usleep(1000000);
iv_ota_update_progress(100);
usleep(1000000);

return;
}