IoT 物联网设备OTA:升级包下载过程详解
OTA概述
大家好,我是一个软件升级包。这几天呢,我将会进行一次神奇的网络之旅,从开发者的电脑中,一直跑到终端嵌入式设备中。
大家都把我的这个旅游过程叫做 OTA,也就是在线升级。
那么啥叫 OTA 呢?全称是:Over the Air Technology,其实就是通过网络来把一个新的软件包从服务器上下载下来,更新到设备上。
首先有一个问题:为什么叫软件升级包,而不叫固件升级包呢?
其实在本质上,固件也是属于软件,大家都是用代码写出来的嘛!
虽然这两个说法很近似,但是有一部分小伙伴还是在狭义上对它们进行了一些区分。
既然如此,我们也就暂且把它俩进行一下区别:
固件:是指一些没有文件系统的嵌入式设备中,把 Flash 分成不同的功能分区。可执行程序需要放在某个固定的起始位置,才能被 bootloader 进行启动。
软件:是指具有文件系统的嵌入式设备,可执行程序直接放在文件系统中。当设备启动之后,操作系统会启动文件系统中的可执行程序。
没有文件系统的嵌入式设备:
带有文件系统的设备:
我知道以上这样的区分方式不是很严谨,但是谁又说得清楚严谨的定义是什么呢?
暂且先这么来区分,只要不影响对文章的理解就可以了!
一个嵌入式设备在进行软件升级的时候,从宏观的角度看,可以分为2 个阶段:
下载升级包;
解压升级包,写入 flash 或文件系统;
今天呢,主要以第 1
阶段为主,带你看一下我是如何从开发者的电脑里,一步一步的被嵌入式设备下载到本地的。
下面是一个完整的过程,让您先睹为快!
上传升级包
为了便于描述,我们来假设一个场景:运行在设备中的软件一共有 3
个文件:
main 文件:可执行程序;
config.ini:配置文件;
mylib.so:一个动态库文件,里面包含一个算法,被 main 文件调用;
目前呢,设备中运行的版本是 V1.0
,现在开发人员对 mylib.so
库中的算法进行了优化,升级为 V2.0
版本,现在需要把这个新版本升级到嵌入式设备中。
首先第一步需要做的事情,咱们用脚后跟都能想得到,那就是把 V2.0
版本的程序软件上传到文件服务器中。
有一点提醒一下:很多云平台都会把应用服务器和文件服务器进行区分。当然,如果仅仅是测试的话,它俩可以在同一台物理服务器上共存。
比如:亚马逊的 AWS
平台,就是把升级包上传到 S3
服务器中。
现在要对 V2.0
版本的程序进行打包了,在这里,除了 main
、config.ini
、mylib.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
呢,也在应用服务器中准备就绪了,现在就等着嵌入式设备开始升级。
万事俱备,只欠东风了!应该说只欠一个触发嵌入式设备进行升级的动作了!
那么,应该在什么时候?由谁?来告诉设备:你正在运行的软件太旧了,服务器上现在有最新的版本,你去升级一下吧!
这个问题的答案就是:八仙过海,各显神通了!
比如:
亚马逊的 AWS 平台,是通过在云平台中部署一个 job,来通知每一个需要升级的设备;
也可以通过一个手机 APP,向某一个嵌入式设备主动发起一个指令:嘿,老兄,请升级一下你的软件;
当终端设备收到升级命令之后,第一步就是下载升级包描述信息。
下载之后,解析这个 json
格式的文本内容,提取出 version
信息之后,与当前正在运行的软件版本进行比较。
如果服务器中的版本比较新,那么就继续提取 url
字段中的升级包下载地址,然后开始从文件服务器中下载新的升级包。
如果当前运行的版本已经是最新的了,那就到此结束!
下载升级包
到了下载升级包的过程就简单了,你可以直接用 wget
等工具来下载,也可以利用 curl
库来手写下载代码。
总之,你可以有一万种方式把我下载到设备中。
下载完成之后,有一件很重要的事情千万别忘记了,那就是:检查下载的升级包是否正确!
还记得升级包描述文件中的 md5
字段吗?那就是我的指纹信息。
你需要首先计算一下下载的升级包的 md5
值,然后与升级包描述文件中的 md5
字段中的值进行比对,如果完全一致,那就放心大胆的开始解压、升级吧!
解压升级包
欲知后事如何,请听下回分解!
IoT 物联网设备OTA:升级包下载过程详解相关推荐
- IoT物联网设备上云技术方案详解
随着传感器和通信技术的不断发展,物联网行业方兴未艾,业务链路涉及数据采集,通信连接,数据存储,数据可视化,洞察,行动决策.但,在实施过程中,碎片化的设备端通信连接难题往往就阻碍了项目落地进程. 今天, ...
- IoT物联网设备OTA:全量升级和增量升级
各位看官好,上一篇文章我们聊了一下关于 OTA 升级过程中,新的软件包是如何从开发者的电脑上,安全的下载到嵌入式设备中的. 这个流程似乎很简单,不就是下载一个文件而已嘛,怎么还值得写成一篇文章呢? 其 ...
- mqtt协议详解_IoT物联网设备上云技术方案详解
随着传感器和通信技术的不断发展,物联网行业方兴未艾,业务链路涉及数据采集,通信连接,数据存储,数据可视化,洞察,行动决策.但,在实施过程中,碎片化的设备端通信连接难题往往就阻碍了项目落地进程. 今天, ...
- IoT 物联网设备端 SDK 架构设计参考
IoT设备端SDK架构挑战 IoT物联网设备应用场景不同导致配置千差万别,在硬件端SDK设计过程中,既要满足多场景快速适配,又要用尽量少的硬件资源,还要满足能力定制化的需求,实现低消耗.易移植.易使用 ...
- Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解
Sonic 开源移动端云真机测试平台 - Agent端服务部署与安卓设备接入演示 一加8手机连接效果图展示 第一章:环境准备 ① agent-sources 资源包下载 ② Android SDK安装 ...
- AWS IoT 物联网设备 - 即时部署 JITP 实战
为了保证通信的安全性,IoT 设备与 AWS IoT Core 的 MQTT 通信使用基于证书的 TLS 1.2 双向认证体系. 利用即时注册(JITR)功能,可以快速的进行设备证书注册及设备上线.但 ...
- IoT物联网设备丢消息问题排查指南
IoT物联网设备受限于硬件性能,不同地域网络覆盖差异大,信号不稳定,数据丢包现象屡见不鲜,且多数设备无人机交互界面,一旦出现设备离线,消息丢失,往往给用户造成不可估量的损失.如何快速定位消息丢失的原因 ...
- 泛泰binx和ota升级包下载工具Android版[2013.6.7提供源代码]
一.简介及下载 写这个工具的目的是为了更方便地下载泛泰最新的binx包和ota升级包. Android版支持英简繁多国语言. 另有Windows版,以及相关介绍和编写说明: http://blog.c ...
- Win+TexLive2020+TexStudio安装过程详解附ElsevierLatex模板下载并使用
Win+TexLive2020+TexStudio安装过程详解附ElsevierLatex模板下载并使用 一.下载并安装Texlive2020 1.下载TexLive2020 2.安装过程 解压之后运 ...
- python离线包安装_python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境...
python的pip是其包管理工具,相当方便好用.本文只介绍pip 如何通过其freeze命令打离线包,及其离线包的安装脚本.这个知识点,特别适用于不适合连通互联网,设备需要物理隔绝,保密要求严格的客 ...
最新文章
- WMI技术介绍和应用——事件通知
- win7 创建FTP站点
- 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements )
- 【PP主数据】工作中心介绍
- 20211028 调节和跟踪
- zblog php版调用代码,zblog PHP分类列表调用方法
- [链接]Python中的metaclass、装饰器
- 5种全局ID生成方式、优缺点及改进方案
- GitGithub学习笔记
- B key-M key-BM key
- 2022年学习数据科学的18个网站
- 高数基础_第1节_概述以及预备知识
- 查询某一天内所有数据(SQL)
- 像呼吸空气一样呼吸创意
- GC8872 Globalchip国产低成本电机驱动芯片,可替代TI的DRV8872 一款具有故障报告功能的 3.6A 刷式直流电机驱动器(PWM控制)
- 时间序列数据可视化:Pyecharts日历图
- XenophonDAO如何使用一颗巧克力的成本摆脱美元霸权,深刻解读$OXPH
- 搜酷:紧跟淘宝步伐的大卖家
- 第四套人民币荧光“四大天王”收藏价值分析
- day13-web前端之JS与JQuery