【摘要】 本文主要介绍Huawei_IoT_Link_SDK_OTA的开发指南,从概述到具体的操作步骤以及后续的编译、适配过程,希望对你有所帮助。

1概述

在应用升级过程中,无线下载更新(OTA)是一种常用,且方便的升级方式。Liteos采用的OTA升级方案基于LwM2M协议,实现了固件升级(FOTA)和软件升级(SOTA)两种升级方案。用户可根据自己的开发环境选择合适的升级方式。 OTA功能代码结构如下图:

2 升级文件二进制文件结构

如图所示,升级压缩包中二进制文件如下图所示,FOTA与SOTA采用相同的固件格式。

  • 签名校验值:长度256字节,对剩余文件进行hash计算后,并进行sha256加密后得到的签名密文。

  • 二进制信息:预留长度32字节,升级文件是全量升级文件或增量升级文件等信息。

  • 升级文件内容:经压缩后的升级文件,升级文件使用hdiffpatch算法对新、旧镜像进行运算生成的差分包,并使用lzma算法进行压缩。

3  存储器接口

存储器结构代码位于iot_link/sotrage目录下。存储器结构被划分为两部分,分别定义为存储设备(storage.c)与设备分区(partition.c)。 存储设备定义的是系统中使用的不同类型存储器及接口,如内部flash,spi flash 或 nandflash等,所使用结构体如下:

typedef struct {int id;char *name;uint32_t size;void (*init)();int (*read)(void *buf, int32_t len, uint32_t offset);int (*write)(const uint8_t *buf, int32_t len, uint32_t offset);int (*erase)(uint32_t offset, int32_t len);int (*erase_write)(const void *buf, int32_t len, uint32_t offset);
}storage_device;
设备分区定义了用户划分的分区信息,如下所示:typedef struct _partition {uint8_t dev_id;char *name;uint32_t start_addr;uint32_t size;
}storage_partition;

设备分区定义了一组外部使用的接口,系统中可以使用这组接口进行相应的读写等操作。

int ota_storage_bin_read(int offset, void *buf, int len);
int ota_storage_bin_write(int offset, void *msg, int len);
int ota_storage_flag_read(ota_flag_t *flag);
int ota_storage_flag_write(ota_flag_t *flag);

4 OTA管理接口

系统中的OTA接口分为三个部分,OTA镜像接口、OTA包管理接口,OTA签名校验接口。

4.1 OTA镜像接口

OTA镜像接口包括了OTA标志镜像和OTA二进制镜像。其中OTA标志存储了升级版本号、升级文件大小、当前OTA状态及OTA升级结果等信息,其结构如下:

#pragma pack(1)
typedef struct
{uint8_t  ver[CN_OTA_VERSION_LEN];uint32_t ver_code;uint32_t file_size;   ///< the new bin file sizeuint32_t blk_size;    ///< the new bin block sizeuint32_t blk_num;     ///< the new bin block numuint32_t blk_cur;uint32_t file_off;    ///< the current offet to writeuint32_t cur_state;   ///< defined by en_ota_status_tuint32_t ret_upgrade; ///< the upgrade,filled by the loaderuint32_t updater;     ///< fota or sotauint32_t crc;         ///< all the ota information computed
}ota_flag_t;
#pragma pack()

在loader和app中维护的同一份OTA标志,APP中会根据下载进度更改cur_state值,在loader中完成升级后会重置cur_state值并填充升级结果到ret_upgrade中,在进入app后将该结果上报至服务器。 外部可调用以下接口进行OTA镜像读写操作:

int storage_partition_read(int part_id, uint8_t *buf, uint32_t len, uint32_t offset);
int storage_partition_write(int part_id, uint8_t *buf, uint32_t len, uint32_t offset);
int storage_partition_erase_write(int part_id, uint8_t *buf, uint32_t len, uint32_t offset);
int storage_partition_erase(int part_id, uint32_t offset, uint32_t len);

4.2 OTA包管理接口

ota_pack实现对接FOTA功能的接口封装。该文件内实现了以下接口:

struct pack_storage_device_api_tag_s { int (*write_software)(pack_storage_device_api_s *thi, uint32_t offset, const uint8_t *buffer, uint32_t len); int (*write_software_end)(pack_storage_device_api_s *thi, pack_download_result_e result, uint32_t total_len); int (*active_software)(pack_storage_device_api_s *thi);
};

4.3 OTA签名校验接口

Ota_checksum实现了升级包签名验证接口。系统中可调用下面接口获取签名校验结果:

int ota_pack_get_signature_verify_result(int sign_len, int file_len);

若用户使用自己的公私钥对,可在此处更改prv_public_key为对应的公钥key值。

5 签名验证

OTA升级包签名验证在下载完成后,发送执行升级命令阶段时执行。

收到执行命令后,系统首先将调用签名校验接口进行二进制文件签名校验,只有在验签通过后,才会执行后续的升级流程,否则会退出升级流程并上报升级失败到服务器。

SOTA在接收到EN_PCP_MSG_EXCUTEUPDATE命令后,位于pcp.c文件中pcp_handle_msg函数。 FOTA流程的签名校验放在了ota_pack_man_software_write_end函数中。

6 Loader

进入Loader后会在ota_detection函数中读取OTA标志,检测当前OTA状态。若为UPDATING状态,则执行升级,否则跳转至APP。

增量升级过程首先会读取升级文件内容并解析出新、旧镜像大小及所使用的压缩插件等信息。

随后调用以下接口:

hpatch_BOOL patch_decompress_with_cache(const hpatch_TStreamOutput* out_newData,const hpatch_TStreamInput*  oldData,const hpatch_TStreamInput*  compressedDiff,hpatch_TDecompress* decompressPlugin,TByte* temp_cache,TByte* temp_cache_end)

执行还原差分镜像。 其中接口参数out_newData、oldData、compressedDiff,需要由用户定义并实现对应的镜像读写接口。

7 FOTA / SOTA

FOTA和SOTA都是基于LwM2M协议实现的升级方案,区别是基于不同的对象。

FOTA使用的是协议中定义的固件对象升级方案,基于对象5实现。

SOTA使用自定义对象19,并使用了PCP协议作为数据传输协议。因此,在使用SOTA时需要将config.mk中的CONFIG_PCP_ENABLE选项使能并使用oc_lwm2m_ota_demo。

8 编译

实现OTA功能需要编译Loader镜像和App镜像。需要对编译选项进行修改:

  • Loader和App镜像大小定义在链接脚本中,当定义的镜像空间不足以容纳生成的镜像时,需要适当的调整其大小。Loader和app的链接脚本分别是os_loader.ld和os_loader.ld,在其中更改MEMORY中的FLASH大小,即可调节对应镜像空间。

  • 在Makefile文件中,将cfg_seperate_load_mode值改为yes,使编译系统通过链接脚本构建目标文件。

  • Config.mk中,需要修改以下值:

CONFIG_MQTT_ENABLE := n // config中默认使用的时mqtt,需将其关闭
CONFIG_LWM2M_ENABLE := y // 使能lwm2m
CONFIG_LWM2M_TYPE := "wakaama_raw" //选择使用的lwm2m实现类型
CONFIG_OC_LWM2M_ENABLE := y // 使能lwm2m的oc接口
CONFIG_OC_LWM2M_TYPE := "atiny_lwm2m_raw" CONFIG_OTA_ENABLE := y
CONFIG_PCP_ENABLE := y // 若使用SOTA,需使能该选项
CONFIG_DEMO_TYPE := "oc_lwm2m_ota_demo" // 并使用该DEMO进行SOTA功能验证
  • 编译loader:在GCC目录下的config.mk文件中,将CONFIG_LOADER_ENABLE和CONFIG_OTA_ENABLE的值改为y,进行loader镜像编译。

  • 编译APP:在config.mk文件中,将CONFIG_LOADER_ENABLE值改为n,同时需要使能CONFIG_PCP_ENABLE和CONFIG_OTA_ENABLE选项,进行App镜像编译。

9 新平台适配

若用户需要在新平台上使用OTA升级功能,需要完成以下工作:

  • 完成存储器的定义。

用户需定义所使用的存储器类型接口及分区信息,并使用以下接口将其注册到系统中:

int storage_dev_install(storage_device *dev, uint32_t max_num);
int storage_partition_init(storage_partition *part, int32_t max_num);
  • 完成OTA镜像接口的定义。

用户需定义ota_storage_t中flag镜像与bin镜像的读写接口,并通过下面接口进行注册:

int ota_storage_install(const ota_storage_t *device);

对于FOTA系统,需要同时适配hal_get_ota_opt函数,填充并返回ota_opt_s的read_flash和write_flash接口。

  • 对于loader,需完成ota_detection函数,实现ota状态检查及镜像的升级功能。

  • 在config.mk中定义CONFIG_LOADER_ENABLE值为y,进行Loader镜像的编译。将改值改为n,进行APP镜像的编译。

  • 在Makefile文件中将cfg_seperate_load_mode赋值为yes,以使用对应的链接脚本来构建对应的执行文件。

作者:​​​​​​​星辰27

【华为云技术分享】漫谈LiteOS-Huawei_IoT_Link_SDK_OTA 开发指导相关推荐

  1. 【华为云技术分享】低代码开发平台发展趋势:低代码——炒作还是趋势?

    在<人月神话>的开篇提到焦油坑,没有别的场景比巨兽在焦油坑中垂死挣扎的场面更令人震撼.上帝见证着恐龙.猛犸象.剑齿虎在焦油中挣扎.他们挣扎的越是猛烈,焦油纠缠的越紧,没有任何猛兽足够壮烈或 ...

  2. 【华为云技术分享】GitHub联合开发

    [摘要] 本文主要讲解使用Github创建私有仓库实现联合开发的详细过程. 1 创建一个Github私有仓库 登录Github账号,点击new新建一个仓库. 新建仓库时,需要填写仓库名称,选择权限为P ...

  3. 【华为云技术分享】物联网常用开发板

    摘要:本文主要介绍物联网中目前较为常用的几款开发板,简单介绍一下各自的特点,希望对你有所帮助. 1 引言 众所周知开发板是物联网架构中的感知层智能设备,这类设备通常有芯片.通信模组.以及操作系统组成. ...

  4. 【华为云技术分享】LiteOS无法直接烧录或者烧录失败解决方法--ST-Link

    前提条件:程序编译成功,并且电脑上已经安装ST-Link驱动,你使用的仿真器也是ST-Link. 上图黑色的是J-Link,下图紫色的是ST-Link,本教程适用于ST-Link,如果是J-Link, ...

  5. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  6. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  7. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  8. 【华为云技术分享】敏捷开发落地不实际?原因可能在于你的 IDE 工具

    对于企业来说,效率就是一切.开发效率的工程化建设已经开始被各大企业提到技术管理日程中.而且现阶段,无论是框架也好.模板也好,目的都是在为提升代码开发效率而努力.随着云计算的深入,端 + 云的开发模式以 ...

  9. 【华为云技术分享】华为云HiLens全面升级,端云协同多模态AI应用开发利器

    [中国,深圳,2020年3月28日] 在华为开发者大会2020(Cloud)期间,华为云推出了全面升级的业界首个端云协同多模态AI应用开发套件--HiLens ,打通线上线下开发和部署流程,开发者只需 ...

  10. 【华为云技术分享】基于小熊派开发板的智慧路灯开发版本更新

    1 主要功能 (1)光敏传感器感知光照强度并上发. (2)实现在云端对LED灯的开关控制. (3)通过设定传感器阈值,设定LED灯的自动开关. 2 目的及意义 (1)通过本次实验加深对于小熊派开发板的 ...

最新文章

  1. java 构造器 血药主题_java中的构造器
  2. SQLite的事务处理方式
  3. dependencies 和 devDependencies 区别
  4. 《Head First设计模式》第七章-适配器模式、外观模式
  5. c语言循环10次代码,C语言教学(七-上)for循环
  6. python设计模式11-享元模式
  7. java第六次实验——多线程
  8. java swing 图片旋转_Java图片旋转,背景透明化
  9. MySQL 本可以用Workbench,为什么还要Navicat
  10. mysql 部署在私有云_教你在 RHEL 7 中部署私有云网盘
  11. 常用免费DEM数据汇总(含下载使用方法)
  12. Linux下编译DCMTK,ACE问题记录
  13. 企业的病毒,要及时清理
  14. 零基础能学大数据吗 需要知道什么核心知识
  15. 自动驾驶平台Apollo 5.5阅读手记:Cyber RT中的任务调度
  16. 实施:GitHub + MarkDown 文档系统的工作环境部署及工作流程说明 | 技术传播
  17. php怎么设置表格大小,如何设置excel表中的单元格大小统一
  18. 广交投集团领导莅临星舆科技参观交流
  19. 努力成为一名数据分析师
  20. jquery学习2_jquery知识预览

热门文章

  1. Ubuntu Mate 开机自启ROS
  2. java jdk文档查询方法_查询Java JDK文档的元数据
  3. 旋翼机自主着陆-主要技术难点
  4. Java中try catch finally语句中含有return语句的执行情况
  5. pycharm 激活方法分享(有效期至2099)
  6. POJ3259(Wormholes) 判断负环
  7. es6 初级之箭头函数
  8. (DFS)zoj1008-Gnome Tetravex
  9. Python 第一章 基础知识
  10. IEnumerableT 接口主要成员