YoC定义了一个FOTA任务用于维护FOTA新版本检测、状态机转换维护和下载控制,抽象了netio用于固件包的下载保存。即:
FOTA模块设计了4个状态转化:
FOTA_INIT
FOTA_DOWNLOAD
FOTA_STOP
FOTA_FINISH
用户启动FOTA后状态为FOTA_INIT,当检测到新版本时,转入FOTA_DOWNLOAD状态,并开始下载固件包。下载失败之后会重新下载或者复位下载流程,取决于重试次数(retry count)。 用户可以通过自定义的方式(添加fota_event_cb回调函数)来根据FOTA在各个阶段报出的事件来执行相应的动作(fota event层),事件回调函数返回值代表不同的含义:
0: 处理完用户事件后继续原先的默认流程;
非零: 处理完用户事件后不会继续原先的默认流程,此时用户需要定义自己的流程去向。
用户定义代码示例如下:
static int fota_event_cb(void *arg, fota_event_e event) //return 0: still do the default handle not zero: only do the user handle
{
fota_t *fota = (fota_t *)arg;
switch (event) {
case FOTA_EVENT_VERSION:
LOGD(TAG, "FOTA VERSION :%x", fota->status);
break;
case FOTA_EVENT_START:
LOGD(TAG, "FOTA START :%x", fota->status);
break;
case FOTA_EVENT_FAIL:
LOGD(TAG, "FOTA FAIL :%x", fota->status);
break;
case FOTA_EVENT_FINISH:
LOGD(TAG, "FOTA FINISH :%x", fota->status);
break;
default:
break;
}
return 0;
}
FOTA框架支持接入不同的FOTA云平台。如: COP、COAP 不同的FOTA平台需要通过对接fota_cls,实现该结构体的操作。
typedef struct fota_cls {
const char *name;
int (*init)(void);
int (*version_check)(fota_info_t *info);
int (*finish)(void);
int (*fail)(void);
} fota_cls_t;
通过int fota_register(const fota_cls_t *cls)
接口注册。
FOTA框架对FOTA下载和存放进行了抽象,形成netio 类,用于可通过netio类来对接不同的下载和存放方式,例如对接ftp下载方式,对接新的 uart 存放方式等。 通过实现结构体 netio_cls 来对接
struct netio_cls {
const char *name;
int (*open)(netio_t *io, const char *path);
int (*close)(netio_t *io);
int (*read)(netio_t *io, uint8_t *buffer, int length, int timeoutms);
int (*write)(netio_t *io, uint8_t *buffer, int length, int timeoutms);
int (*remove)(netio_t *io);
int (*seek)(netio_t *io, size_t offset, int whence);
};
用户需要实现 netio_cls 接口的 open、close、read、write、remove、seek接口,并通过netio_register
接口注册进FOTA。
固件下载完毕之后会设备会重启进入固件升级模式,等待升级完毕之后设备正常启动。一个完整的FOTA流程结束。
yoc init
yoc install fota
无。
函数 | 说明 |
---|---|
fota_do_check | 强制检测版本 |
fota_start | 创建FOTA服务 |
fota_stop | 停止FOTA功能,退出FOTA服务 |
fota_config | 配置FOTA参数 |
fota_set_auto_check | 设置是否自动不断检测服务器固件版本并升级的功能 |
fota_get_auto_check | 获取是否自动检测判断 |
fota_get_status | 获取升级状态 |
fota_open | fota初始化 |
fota_close | 关闭FOTA功能,释放所有资源 |
fota_register_cop | 注册为cop平台,即从cop平台下载固件 |
fota_register | 注册平台接口 |
void fota_do_check(fota_t *fota);
功能描述:
参数:
fota
: fota 句柄。返回值:
int fota_start(fota_t *fota);
功能描述:
参数:
fota
:fota 句柄。返回值:
int fota_stop(fota_t *fota);
功能描述:
参数:
fota
: fota 句柄。返回值:
void fota_config(fota_t *fota, fota_config_t *config);
功能描述:
参数:
fota
: fota 句柄。config
: 配置数据。返回值:无
void fota_set_auto_check(fota_t *fota, int enable);
功能描述:
参数:
fota
: fota 句柄。enable
: 使能标记。返回值:无。
int fota_get_auto_check(fota_t *fota);
功能描述:
参数:
fota
: fota 句柄。返回值:
fota_status_e fota_get_status(fota_t *fota);
功能描述:
参数:
fota
: fota 句柄。返回值:
fota_t *fota_open(const char *fota_name, const char *dst, fota_event_cb_t event_cb);
功能描述:
参数:
fota_name
:FOTA平台名字,比如"cop"。dst
:差分包存储url。event_cb
:用户事件回调。返回值:
int fota_close(fota_t *fota);
功能描述:
参数:
fota
:fota 句柄。返回值:
int fota_register_cop(void);
功能描述:
参数:
返回值:
int fota_register(const fota_cls_t *cls);
功能描述:
参数:
cls
:不同平台实现的接口集合,具体实现接口见fota_cls_t
。返回值:
cop平台FOTA模块的初始化过程:
void app_fota_init(void)
{
int ret;
LOGI(TAG, "======> %s\r\n", aos_get_app_version());
int fota_en = 1;
ret = aos_kv_getint(KV_FOTA_ENABLED, &fota_en);
if (ret == 0 && fota_en == 0) {
return;
}
fota_register_cop();
netio_register_http();
netio_register_flash();
g_fota_handle = fota_open("cop", "flash://misc", fota_event_cb);
g_fota_handle->auto_check_en = 1;
g_fota_handle->sleep_time = 60000;
g_fota_handle->timeoutms = 10000;
g_fota_handle->retry_count = 0;
fota_start(g_fota_handle);
}
无。
无。
无。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。