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服务接口使用请参考linkkitappotaapp

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(&param);

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);

配置说明

在AliOS Things 源码里面输入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;