嵌入式设备OTA升级的大致过程!

news2025/5/25 19:24:01

OTA概述

大家好,我是一个软件升级包。这几天呢,我将会进行一次神奇的网络之旅,从开发者的电脑中,一直跑到终端嵌入式设备中。

大家都把我的这个旅游过程叫做 OTA,也就是在线升级。

那么啥叫 OTA 呢?全称是:Over the Air Technology,其实就是通过网络来把一个新的软件包从服务器上下载下来,更新到设备上。

图片

首先有一个问题:为什么叫软件升级包,而不叫固件升级包呢?

其实在本质上,固件也是属于软件,大家都是用代码写出来的嘛!

虽然这两个说法很近似,但是有一部分小伙伴还是在狭义上对它们进行了一些区分。

既然如此,我们也就暂且把它俩进行一下区别:

  1. 固件:是指一些没有文件系统的嵌入式设备中,把 Flash 分成不同的功能分区。可执行程序需要放在某个固定的起始位置,才能被 bootloader 进行启动。

  2. 软件:是指具有文件系统的嵌入式设备,可执行程序直接放在文件系统中。当设备启动之后,操作系统会启动文件系统中的可执行程序。

没有文件系统的嵌入式设备:

图片

带有文件系统的设备:

图片

我知道以上这样的区分方式不是很严谨,但是谁又说得清楚严谨的定义是什么呢?

暂且先这么来区分,只要不影响对文章的理解就可以了!

一个嵌入式设备在进行软件升级的时候,从宏观的角度看,可以分为2 个阶段:

  1. 下载升级包;

  2. 解压升级包,写入 flash 或文件系统;

今天呢,主要以第 1 阶段为主,带你看一下我是如何从开发者的电脑里,一步一步的被嵌入式设备下载到本地的。

下面是一个完整的过程,让您先睹为快!

图片

上传升级包

为了便于描述,我们来假设一个场景:运行在设备中的软件一共有 3 个文件:

  1. main 文件:可执行程序;

  2. config.ini:配置文件;

  3. mylib.so:一个动态库文件,里面包含一个算法,被 main 文件调用;

目前呢,设备中运行的版本是 V1.0,现在开发人员对 mylib.so 库中的算法进行了优化,升级为 V2.0 版本,现在需要把这个新版本升级到嵌入式设备中。

首先第一步需要做的事情,咱们用脚后跟都能想得到,那就是把 V2.0 版本的程序软件上传到文件服务器中。

有一点提醒一下:很多云平台都会把应用服务器和文件服务器进行区分。当然,如果仅仅是测试的话,它俩可以在同一台物理服务器上共存。

比如:亚马逊的 AWS 平台,就是把升级包上传到 S3 服务器中。

现在要对 V2.0 版本的程序进行打包了,在这里,除了 mainconfig.inimylib.so 这 3 个文件之外,我们还把另一个脚本文件 upgrade.sh 也放进打包文件中。

这个文件的作用暂且不说,到后面会为您揭晓答案。

Bingo - V2.0 版本的升级包诞生了:app_v2_0.tgz,上传到文件服务器上之后,地址为:http://fileserve/app_v2_0.tgz

图片

上传升级包描述文件

现在,V2.0 版本的升级包已经上传到文件服务器中了,是否现在就可以命令嵌入设备去下载、升级了呢?

我们知道,在一个物联网系统中,一般都是存在着很多个终端设备的。

这些设备可能处于正在运行状态、也可能处于断电状态,而且咱们也不能假设所有的设备都在同一个时间点进行升级。

再而且,一个设备进行升级之后,就变成了最新的 V2.0 版本,那么这个设备就应该有能力知道服务器上的最新版本是 V2.0 版本,这样它就不需要升级了。

因此,还需要一个新的文件来描述文件服务器中的 V2.0 版本的升级包,就叫它:升级包描述文件 app_desc.json,它的内容是 json 格式的字符串:

图片

version 字段描述了文件服务器上升级包的版本,这样的话,设备就可以知道到服务器中的最新版本。

url 字段描述了升级包的下载地址,设备如果发现自己的版本低于 version 字段中的版本,就可以从这个地址下载新的升级包。

md5 字段描述了服务器中最新升级包的指纹信息,当设备把服务器上的升级包下载之后,需要计算一下升级包的 MD5 值,然后与这里的 md5 字段进行比较,如果相同的话,说明下载的升级包没有问题,没有被恶意的家伙掉包。

了解了升级包描述文件 app_desc.json 的作用之后,这个文件就被上传到应用服务器中了。

图片

下载升级包描述文件

此时,作为升级包的我,已经静静的躺在文件服务器中了,我的兄弟升级包描述文件 app_desc.json 呢,也在应用服务器中准备就绪了,现在就等着嵌入式设备开始升级。

万事俱备,只欠东风了!应该说只欠一个触发嵌入式设备进行升级的动作了!

那么,应该在什么时候?由谁?来告诉设备:你正在运行的软件太旧了,服务器上现在有最新的版本,你去升级一下吧!

这个问题的答案就是:八仙过海,各显神通了!

比如:

  1. 亚马逊的 AWS 平台,是通过在云平台中部署一个 job,来通知每一个需要升级的设备;

  2. 也可以通过一个手机 APP,向某一个嵌入式设备主动发起一个指令:嘿,老兄,请升级一下你的软件;

图片

当终端设备收到升级命令之后,第一步就是下载升级包描述信息。

图片

下载之后,解析这个 json 格式的文本内容,提取出 version 信息之后,与当前正在运行的软件版本进行比较。

如果服务器中的版本比较新,那么就继续提取 url 字段中的升级包下载地址,然后开始从文件服务器中下载新的升级包。

如果当前运行的版本已经是最新的了,那就到此结束!

下载升级包

到了下载升级包的过程就简单了,你可以直接用 wget 等工具来下载,也可以利用 curl 库来手写下载代码。

总之,你可以有一万种方式把我下载到设备中。

图片

下载完成之后,有一件很重要的事情千万别忘记了,那就是:检查下载的升级包是否正确!

还记得升级包描述文件中的 md5 字段吗?那就是我的指纹信息。

你需要首先计算一下下载的升级包的 md5 值,然后与升级包描述文件中的 md5 字段中的值进行比对,如果完全一致,那就放心大胆的开始解压、升级吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内,打开 “Git Bash Here” 2.初始化,在“Git Bash Here”中输入 git init 3.加入所有文件,在“Git Bash Here”中输入 git add . (需要注意,git add 后面还有一个点) 4.添加备注,git com…

KUKA机器人在编程时添加需要等待的输入信号的2种方法

KUKA机器人在编程时添加需要等待的输入信号的2种方法 第一种方法:手动输入法 如下图所示,选中某个程序后,点击下方的“打开”, 如下图所示,将光标定位到所需位置,然后按下左上角的“编辑”按钮,此时示教器上会弹出输入键盘, 如下图所示,在键盘上手动输入语句:wait fo…

linux下部署frp客户端服务端-内网穿透

简介 部署在公司内部局域网虚拟机上的服务需要在外网能够访问到,这不就是内网穿透的需求吗,之前通过路由器实现过,现在公司这块路由器不具备这个功能了,目前市面上一些主流的内网穿透工具有:Ngrok,Natapp&…

西南科技大学C++程序设计实验十二(文件流操作)

一、实验目的 1. 熟悉文件的基本操作; 2. 在类中添加打开文件、保存文件、读取文件等处理函数; 二、实验任务 1. 分析完善程序:主函数创建一个文件对象,每次打开文件,在其尾部添加数据。如果文件不存在,则新建该文件。请将空白处需要完善的功能补充完整。 #include …

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署,10月7日,杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单(第二批)。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》(工信部企业…

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台,但是由于还没有拿到EVT。所以,就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后,充满剩余时间异常的问题。 问题描述,在充电过程中,显示充满时间为“0 min left unt…

MSSQL 程序集使用方法

1.C# 写一个程序 1.1新建一个项目【类库【.Net FrameWork】 1.2编写代码 删除 namespace ApiSQLClass { } 代码如下:【具体调用API模式根据具体编写】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.…

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试,使用该类的实例执行关闭server时,并没有释放端口号,会导致第二次启动时失败。另外,使用该…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error!新建messages_zh_CN.properties文件 user.login.error帐户或密码错误!2. 新建LocaleConfig.java文件 Configurati…

geolife笔记:整理处理单条轨迹

以 数据集笔记 geolife (操作篇)_geolife数据集-CSDN博客 轨迹为例 1 读取数据 import pandas as pd data pd.read_csv(Geolife Trajectories 1.3/Data//000/Trajectory/20081023025304.plt,headerNone, skiprows6,names[Latitude, Longitude, Not_Im…

手持式安卓主板_PDA安卓板_智能手持终端方案

手持式安卓主板方案是一种智能终端设备,具备自动对焦和闪光灯功能,可以在昏暗的环境下快速扫描二维码并轻松采集数据。该方案还提供多渠道支付和数据采集功能,为用户提供了便捷的体验。 该方案的产品基于手持式安卓主板,并搭载了八…

如何提高Pycharm的使用体验?

汉化 文件---设置---插件---chinese---安装---重启ide 代码补全 tabnine 文件---设置---插件---tabnine---安装---重启ide 重启ide后生效,补全效果如下 自定义背景 文件---设置---外观---背景图像---选择图片---调整透明度保存即可 设置头部声明 英文版…

JVM学习笔记-如何在IDEA打印JVM的GC日志信息

若要在Idea上打印JVM相应GC日志,其实只需在Run/Debug Configurations上进行设置即可。 拿《深入Java虚拟机》书中的3-7代码例子来演示,如 1 public class JvmTest {2 private static final int _1MB1024*1024;3 public static void main(String…

理解基于 Hadoop 生态的大数据技术架构

转眼间,一年又悄然而逝,时光荏苒,岁月如梭。当回首这段光阴,不禁感叹时间的匆匆,仿佛只是一个眨眼的瞬间,一年的旅程已成为过去,而如今又到了画饼的时刻了 ! 基于 Hadoop 生态的大数…

快速认识什么是:Docker

Docker,一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢?今天就来一起学快速入门一下Docker吧!希望本文对您有所帮助。 假设您使用 Cobol 构建了一个在某种奇怪风格的 Linux 上运行的应用程序。您…

Spring Boot Async:从入门到精通,原理详解与最佳实践

Spring Boot 的异步功能(Async)允许我们将某些任务异步执行,而不会阻塞主线程。这对于处理耗时的操作非常有用,如发送电子邮件、生成报表、调用外部 API 等。通过异步处理,我们可以释放主线程,让它继续处理…

【学习笔记】lyndon分解

摘抄自quack的ppt。 这部分和 s a sa sa的关联比较大,可以加深对 s a sa sa的理解。 Part 1 如果字符串 s s s的字典序在 s s s以及 s s s的所有后缀中是最小的,则称 s s s是一个 lyndon \text{lyndon} lyndon串。 lyndon \text{lyndon} lyndon分解&a…

连接Redis报错解决方案

连接Redis报错&解决方案 问题描述:Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。 问题原因:redis启动方式不正确 解决方案: 在redis根目录下打开命令行窗口,输入命令redi…

【SpringBoot】分层解耦

1. 三层架构 Controller:控制层。接收前端发送的请求,调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)Service:业务逻辑层。处理具体的业务逻辑。调用Dao层(逻辑…

旺店通无代码API集成:电商平台的客服系统和营销自动化解决方案

无代码API集成的力量 在数字化转型的浪潮中,电商平台迅速崛起,成为企业不可或缺的销售和市场推广渠道。旺店通企业版奇门以其无代码开发的连接和集成能力,重塑了电商系统的运营模式。无需繁琐的API开发,企业即可实现电商平台与客…