OTA(over the air)已成为物联网设备的刚需功能, AliIOS Things OTA有完备的升级方案,对各种升级场景都有很好的支持;除一般的整包升级外,现有的高阶能力有:压缩升级、差分升级及安全升级;支持的升级通道:http、https、BLE、3G/4G,NB等;复杂场景支持:网关及子设备升级,连接型模组升级非连接主设备的间接升级;完备的配套工具:差分工具、本地签名工具、ymodem辅助升级工具,多固件打包工具等;
API 列表
ota_service_init() | 初始化OTA模块 |
ota_service_start() | 固件下载,完成OTA固件的主要流程 |
ota_hal_init() | OTA hal层初始化,主要完成ota flash 下载分区的初始化等操作 |
ota_hal_write() | 写固件到ota 存储区 |
ota_hal_read() | 读取ota 存储区固件数据 |
ota_hal_boot() | 设置保存bootload相关的固件及升级状态信息 |
ota_hal_rollback() | 检测OTA升级是否升级成功 |
ota_hal_version() | 获取固件版本号 |
使用
添加该组件
aos.mk 中引入:
$(NAME)_COMPONENTS += ota
Config.in 中引入:
config ENABLE_OTA
bool "Enable OTA"
default y
help
enable feature OTA.
包含头文件
#include "ota/ota_agent.h"
使用示例
ota服务接口使用请参考linkkitapp或otaapp
API 详情
OTA的API说明请参考include/dm/ota/ota_hal.h
ota_service_init()
初始化ota服务
函数原型
int ota_service_init(ota_service_t *ctx);
输入参数
ota_service_t *ctx |
ota参数集 | "devicename" , "devicesercet", "productname","productsecret"等 |
返回参数
返回参数宏定义见include/dm/ota/ota_agent.h文件
调用示例
ota_service_t ctx = {0};
char product_key[21] = "a1RIsMLz2BJ";
char product_secret[65] = "fSAF0hle6xL0oRWd";
char device_name[33] = "example1";
char device_secret[65] = "RDXf67itLqZCwdMCRrw0N5FHbv5D7jrE";
memset(&ctx, 0, sizeof(ota_service_t));
strncpy(ctx.pk, product_key, sizeof(ctx.pk) - 1);
strncpy(ctx.dn, device_name, sizeof(ctx.dn) - 1);
strncpy(ctx.ds, device_secret, sizeof(ctx.ds) - 1);
strncpy(ctx.ps, product_secret, sizeof(ctx.ps) - 1);
ctx.dev_type = 1;
ota_service_init(&ctx);
ota_service_start()
固件下载,完成OTA固件的主要流程
函数原型
int ota_service_start(ota_service_t *ctx);
输入参数
ota_service_t *ctx |
ota参数集 | "devicename" , "devicesercet", "productname","productsecret"等 |
返回参数
返回参数宏定义见include/dm/ota/ota_agent.h文件
调用示例
ota_service_t ctx = {0};
char product_key[21] = "a1RIsMLz2BJ";
char product_secret[65] = "fSAF0hle6xL0oRWd";
char device_name[33] = "example1";
char device_secret[65] = "RDXf67itLqZCwdMCRrw0N5FHbv5D7jrE";
memset(&ctx, 0, sizeof(ota_service_t));
strncpy(ctx.pk, product_key, sizeof(ctx.pk) - 1);
strncpy(ctx.dn, device_name, sizeof(ctx.dn) - 1);
strncpy(ctx.ds, device_secret, sizeof(ctx.ds) - 1);
strncpy(ctx.ps, product_secret, sizeof(ctx.ps) - 1);
ctx.dev_type = 1;
ota_service_start(&ctx);
ota_hal_init()
OTA hal层初始化,主要完成ota 下载分区flash擦除,待下载固件size判断等操作,此函数为弱符号函数,用户可自定义
函数原型
int ota_hal_init(ota_boot_param_t *parm);
输入参数
ota_boot_param_t *parm |
boot 参数集 |
返回参数
返回参数宏定义见include/dm/ota/ota_agent.h文件
调用示例
int ret = 0;
ota_boot_param_t param;
param.len = 512000; /*500k*/
ret = ota_hal_init(¶m);
ota_hal_write()
向ota 存储区写固件数据,此函数为弱符号函数,用户可自定义
函数原型
int ota_hal_write(unsigned int *off_set, char *in_buf, unsigned int in_buf_len);
输入参数
unsigned int *off_set |
相对ota 存储flash起始地址偏移量 | 0 |
char *in_buf |
保存固件数据 | 0xab,0xcd,0xef,0xgh |
unsigned int in_buf_len |
写入数据长度,单位为字节 | 4 |
返回参数
返回参数宏定义见include/dm/ota/ota_agent.h文件
调用示例
int ret = 0;
unsigned int offset = 0;
char buf[4] = {0xab, 0xcd, 0xef, ox12};
ret = ota_hal_write(&offset, buf, sizeof(buf));
ota_hal_read()
从ota 存储区读取固件数据,此函数为弱符号函数,用户可自定义
函数原型
int ota_hal_read(unsigned int *off_set, char *out_buf, unsigned int out_buf_len);
输入参数
unsigned int *off_set |
相对ota 存储flash起始地址偏移量 | 0 |
char *out_buf |
读取固件数据 | 0xab\0xcd\0xef |
unsigned int out_buf_len |
读取的长度,单位为字节 | 3 |
返回参数
返回参数宏定义见include/dm/ota/ota_agent.h文件
调用示例
int ret = 0;
unsigned int offset = 0;
char buf[4] = {0};
ret = ota_hal_read(&offset, buf, sizeof(buf));
ota_hal_boot()
保存bootload相关的固件及升级状态信息,此函数为弱符号函数,用户可自定义
函数原型
int ota_hal_boot(ota_boot_param_t *parm);
输入参数
ota_boot_param_t *parm |
boot参数集 |
返回参数
返回参数宏定义见include/dm/ota/ota_agent.h文件
调用示例
/* OTA upgrade magic <--> upg_flag */
#define OTA_UPGRADE_CUST 0x8778 /* upgrade user customize image */
#define OTA_UPGRADE_ALL 0x9669 /* upgrade all image: kernel+framework+app */
#define OTA_UPGRADE_XZ 0xA55A /* upgrade xz compressed image */
#define OTA_UPGRADE_DIFF 0xB44B /* upgrade diff compressed image */
int ret = 0;
ota_boot_param_t ota_info;
ota_info.len = 512000; /*image size = 500k*/
ota_info.upg_flag = OTA_UPGRADE_ALL;
ret = ota_hal_boot(&ota_info);
ota_hal_rollback()
检测OTA升级是否升级成功,此函数为弱符号函数,用户可自定义
函数原型
int ota_hal_rollback(void);
输入参数
NULL
返回参数
返回参数宏定义见include/dm/ota/ota_agent.h文件
调用示例
int ret = 0;
ret = ota_hal_rollback();
ota_hal_version()
获取固件版本号,此函数为弱符号函数,用户可自定义
函数原型
const char *ota_hal_version(unsigned char dev_type, char *dn);
输入参数
unsigned char dev_type |
设备类型 | 0(主设备) |
char *dn |
设备名称 | "light" |
返回参数
返回设备的版本号,如“app-1.0.0”
调用示例
const char *ver = NULL;
unsigned char dev_type = 0;
char *dev_name = "light"
ver = ota_hal_version(dev_type, dev_name);
配置说明
aos make menuconfig
命令即可进入到menuconfig配置界面中,依次选择Middleware
-> OTA Features
即可进入到OTA组件的配置界面: 
配置项说明
--- OTA Features
[ ] OTA Secure Downloading Mode (NEW) #是否支持https 下载方式升级
[ ] OTA via uAgent (NEW) #是否支持uAgent方式升级
[ ] RSA Verify Support (NEW) #是否支持安全升级
(5) OTA Download Retry Count (NEW) #固件下载失败的重试次数
(20000) OTA Download Timeout(ms) (NEW) # 固件下载超时时间
(512) OTA Download Block Size(bytes) (NEW) # OTA下载固件每次读取数据大小
(1024) OTA write flash cache size(bytes) (NEW) # OTA写flash缓存大小,默认是1k,可根据设备资源自定义size
[ ] BLE OTA Support (NEW) # 开启BLE OTA功
其他
返回参数定义
返回参数定义在include/dm/ota/ota_agent.h文件中。
/* OTA status code */
typedef enum {
OTA_FINISH = 4, /*OTA finish status*/
OTA_DOWNLOAD = 3, /*OTA download status*/
OTA_TRANSPORT = 2, /*OTA transport status*/
OTA_INIT = 1, /*OTA init status*/
OTA_SUCCESS = 0,
OTA_INIT_FAIL = -1, /*OTA init failed.*/
OTA_TRANSPORT_INT_FAIL = -2, /*OTA transport init failed.*/
OTA_TRANSPORT_PAR_FAIL = -3, /*OTA transport parse failed.*/
OTA_TRANSPORT_VER_FAIL = -4, /*OTA transport verion is too old.*/
OTA_DOWNLOAD_INIT_FAIL = -5, /*OTA download init failed.*/
OTA_DOWNLOAD_HEAD_FAIL = -6, /*OTA download header failed.*/
OTA_DOWNLOAD_CON_FAIL = -7, /*OTA download connect failed.*/
OTA_DOWNLOAD_REQ_FAIL = -8, /*OTA download request failed.*/
OTA_DOWNLOAD_RECV_FAIL = -9, /*OTA download receive failed.*/
OTA_VERIFY_MD5_FAIL = -10, /*OTA verfiy MD5 failed.*/
OTA_VERIFY_SHA2_FAIL = -11, /*OTA verfiy SH256 failed.*/
OTA_VERIFY_RSA_FAIL = -12, /*OTA verfiy RSA failed.*/
OTA_VERIFY_IMAGE_FAIL = -13, /*OTA verfiy image failed.*/
OTA_UPGRADE_WRITE_FAIL = -14, /*OTA upgrade write failed.*/
OTA_UPGRADE_PARAM_FAIL = -15, /*OTA upgrade parameter failed.*/
OTA_UPGRADE_FW_SIZE_FAIL = -16, /*OTA upgrade FW too big.*/
OTA_UPGRADE_SET_BOOT_FAIL = -17, /*OTA upgrade set boot failed.*/
OTA_CUSTOM_CALLBAK_FAIL = -18, /*OTA custom callback failed.*/
OTA_MCU_INIT_FAIL = -19, /*OTA MCU init failed.*/
OTA_MCU_VERSION_FAIL = -20, /*OTA MCU version failed.*/
OTA_MCU_NOT_READY = -21, /*OTA MCU not ready.*/
OTA_MCU_REBOOT_FAIL = -22, /*OTA MCU fail to reboot.*/
OTA_MCU_HEADER_FAIL = -23, /*OTA MCU header error.*/
OTA_MCU_UPGRADE_FAIL = -24, /*OTA MCU upgrade fail.*/
OTA_INVALID_PARAMETER = -25, /*OTA INVALID PARAMETER.*/
} OTA_ERRNO_E;
在文档使用中是否遇到以下问题
更多建议
匿名提交