当前位置:首页 > > IOT物联网小镇
[导读]在最近的两篇文章中,我们从概念和流程上梳理了:一个终端设备如何把一个固件,安全无误的从服务器上,下载到本地。文章链接在此:物联网设备OTA软件升级之:升级包下载过程之旅物联网设备OTA软件升级之:完全升级和增量升级这篇文章就继续往下深入,以一个实际的ESP32项目,来完整的梳理一...

在最近的两篇文章中,我们从概念流程上梳理了: 一个终端设备如何把一个固件,安全无误的从服务器上,下载到本地。


文章链接在此:


物联网设备OTA软件升级之:升级包下载过程之旅


物联网设备OTA软件升级之:完全升级和增量升级


这篇文章就继续往下深入,以一个实际的ESP32项目,来完整的梳理一下OTA升级的全过程。


ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理主要包括下面3部分内容:


  1. AWS 平台上,部署一个 OTA 升级任务时,需要完成哪些步骤;


  2. ESP32 模组中,关于 Flash 分区和 OTA 升级控制过程和代码说明;


  3. 如何通过 ESP32,给与之相连的 MCU 进行 OTA 升级;


PS: 在下面的内容中,终端设备指的就是 ESP32 模组。
ESP32 Flash 分区
其实ESP32的官方文档的过程描述,已经是非常的详细了。


不仅把每一个操作的步骤都写的很清楚,而且把一些可能遇到的错误,都会做一些善意的提醒。


下面这部分内容,基本上是来源于官方的文档。


我们这里只是把一些与本文相关的、比较重要的内容摘录在这里。


首先要了解的,肯定是Flash的分区信息了。


所有的固件、数据,都要存储在Flash中,它是一个系统的记忆部件,离开了它,再怎么聪明的CPU都无用武之地。


关于分区表,ESP32中预定义了2份分区表,分别对应:是否存在 OTA 功能这两种情况,截图如下:


没有 OTA 的分区表


ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理有 OTA 功能的分区表


ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理官方的文档链接在这里: https://docs.espressif.com/projects/esp-idf/zh_CN/v4.3-beta3/esp32/api-guides/partition-tables.html。


既然我们是在描述OTA过程,那肯定就是以带有OTA功能的这个分区表为准了。


ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理


在这张分区表中,一共定义了3个应用程序分区:


factory 分区;
ota_0 分区;
ota_1 分区;


这三个分区的类型都是app,但具体app的类型不相同。


其中,位于0x10000偏移地址处的为出厂应用程序(factory),其余两个为OTA应用程序(ota_0,ota_1)。


名为otadata的数据分区,用于保存OTA升级时需要的数据。


启动加载器会查询该分区(otadata)的数据,以判断:应该从哪个OTA应用程序分区来加载程序


如果otadata分区为空(说明这台设备还没有进行过OTA升级),则会执行出厂程序,也就是执行factory分区中的固件程序。


如果otadata分区非空,则启动加载器将加载这个分区中的数据,进而判断: 启动哪个 OTA 镜像文件



AWS 平台部署 OTA 升级任务
AWS平台按照不同的业务类型,划分为不同的服务。这样处理起来,流程更规范,操作步骤也更多,当然也更赚钱一些!


从上一篇文章中可以看到,当一个新的固件准备好之后,需要做2件事情:


  1. 把固件(bin 文件)和一个固件描述文件(json格式的文本文件),上传到 S3 云存储服务器上;


  2. 在 AWS Core 任务管理中,新建一个升级任务(会得到一个 Job ID)。在这个任务中需要选择:


(1) 步骤1中上传的 json 文件;


(2) 哪些终端设备需要升级;


json格式的固件描述文档,格式大概如下(可以根据实际的业务需求进行修改):


{
"product": "产品名称",
"group": "设备分组",
"firmware":
[
{
"ota_type": "esp32",
"url": "http://xxx/esp32-v1.1.0.bin",
"md5": "xxx"
}
]
}
不知道您是否注意到:在firmware字段中,使用的是数组([...]),而不是对象({...})?


这样来组织的原因是,OTA升级不仅仅可以对ESP32模组中的固件进行升级("ota_type": "esp32"),还可以对其他的一些固件或用户数据进行更新。


比如:更新ESP32串口连接的MCU中的固件程序。


ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理对了,一个终端在通过网络连接到云平台时,都有一个唯一的 ID编号,一般都是利用ESP32模组上的网卡MAC地址来作为唯一ID。


当完成以上步骤时,在服务器端,就存在着一个升级任务关系链


ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理也就是说:一个Job ID就对应着一次OTA升级任务。终端设备在进行OTA升级过程中,就是从这个Job ID开始的。



ESP32 OTA 升级的触发
ESP32与AWS平台之间,是通过MQTT协议进行通信的。


因此,当运营人员创建了一个OTA升级任务后,所有相关的终端设备,必须从某个预先确定好的主题(topic)中,接收到OTA升级通知指令


例如一个可能的topic:$aws/things/xxx/job/notify


其中的xxx,代表终端设备的MAC地址,只有这样,每一个设备才能够接收到属于自己的命令。


升级通知指令的内容中,一定会包含OTA升级的Job ID,例如:


{
"timestamp": "xxxxxx",
"job_id": "001"
}
当终端设备接收到这个升级通知指令时,提取出job_id字段,然后向云平台发起请求:获取与这个job_id关联的固件描述信息,也就是之前上传的Json格式的文件息。


AWS平台接收到这个请求后,就会把与这个job_id相关联的OTA升级任务描述文件(json文件),发送给终端设备。


设备拿到了固件描述文件,自然也就知道了固件的:版本,下载地址,MD5 值等信息,于是就进入后面的下载环节了。


ESP32 开发之:亚马逊 AWS 平台 OTA 升级过程完全梳理以上的过程描述,基本上是一个终端设备触发OTA升级的最基本的过程。


在实际的项目中,可能会遇到一些稍微复杂的情况。


例如:一个终端设备一直处于断电状态。此时,云平台中已经对固件进行了好几次的升级,但是由于这台设备一直没有运行,因此它的固件已经过时了好几个版本。


有一天,这台设备上电运行了,此时它会从云平台接收到好几个升级任务,这个时候应该如何处理呢?


也许,我们就要对升级通知的指令中,赋予更多详细的内容,让这台设备有足够的信息来判断该如何进行升级。



ESP32 固件下载和本地升级
ESP32在提取出固件的下载地址(URL)之后,就开始进入下载环节了。


官方文档非常详细的描述了固件的下载过程。


下面这段代码,就是从官方文档中摘抄过来的:


链接地址:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/ota.html


bool image_header_was_checked = false;
while (1) {
int data_read = esp_http_client_read(client, ota_write_data, BUFFSIZE);
...
if (data_read > 0) {
if (image_header_was_checked == false) {
esp_app_desc_t new_app_info;
if (data_read > sizeof(esp_image_header_t) sizeof(esp_image_segment_header_t) sizeof(esp_app_desc_t)) {
// check current version with downloading
if (esp_efuse_check_secure_version(new_app_info.secure_version) == false) {
ESP_LOGE(TAG, "This a new app can not be downloaded due to a secure version is lower than stored in efuse.");
http_cleanup(client);
task_fatal_error();
}

image_header_was_checked = true;

esp_ota_begin(update_partition, OTA_SIZE_UNKNOWN,
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭