物联网设备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 字段中的值进行比对,如果完全一致,那就放心大胆的开始解压、升级吧!
解压升级包
欲知后事如何,请听下回分解!
------ End ------
Hi~您好,我是道哥,一枚嵌入式开发老兵。
这是我的个人微信,做个点赞之交也不错哦!

让知识流动起来,越分享越幸运!
星标公众号,能更快找到我!
推荐阅读
【1】C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻
【2】一步步分析-如何用C实现面向对象编程
【3】原来gdb的底层调试原理这么简单
【4】内联汇编很可怕吗?看完这篇文章,终结它!
【5】都说软件架构要分层、分模块,具体应该怎么做
物联网设备OTA软件升级之:升级包下载过程之旅的更多相关文章
- ESA2GJK1DH1K升级篇: 阿里云物联网平台 OTA: 关于阿里云物联网平台 OTA 的升级流程
前言 鉴于有些用户直接想使用现成的物联网平台实现 OTA 远程升级 我就写一写这系列的文章 注意:首先大家必须把我自建服务器是如何实现的看明白! 我看了下阿里云提供的,实际上流程和咱自建实现的差别不大 ...
- Android服务器——使用TomCat实现软件的版本检测,升级,以及下载更新进度!
Android服务器--使用TomCat实现软件的版本检测,升级,以及下载更新进度! 算下来,TomCat服务器已经写了很长一段时间了,一直说拿他来搞点事 情,也一直没做,今天刚好有空,交流群还有人请 ...
- 安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备
安天透过北美DDoS事件解读IoT设备安全 安天安全研究与应急处理中心(安天CERT)在北京时间10月22日下午启动高等级分析流程,针对美国东海岸DNS服务商Dyn遭遇DDoS攻击事件进行了跟进分析. ...
- 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级
SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...
- Android OTA在线升级一(架构分析)【转】
本文转载自:http://blog.csdn.net/yanleizhouqing/article/details/50234213 1.前言 OTA(Over-the-Air Technology) ...
- JLink软件升级到4.92之后,Jlink不能用了
JLink软件升级到4.92之后,Jlink不能用了 情景描述: Jlink软件升级到4.9 ...
- EPON ONU软件升级的若干优化方案
1 说明 目前EPON ONU软件升级主要有IP方式(如SNMP/TR069)和TFTP+OAM两种.前者需占用大量IP地址,且配置ONU的IP地址需要手工操作,给业务开通和系统维护带来较大不便:后者 ...
- 微软、谷歌、亚马逊、Facebook等硅谷大厂91个开源软件盘点(附下载地址)
开源软件中有大量专家构建的代码,大大节省了开发人员的时间和成本,热衷于开源的大厂们总是能够带给我们新的惊喜.2016年9月GitHub报告显示,GitHub已经有超过 520 万的用户和超 30 万的 ...
- 【阿里云IoT+YF3300】6.物联网设备报警配置
纵然5G时代已经在时代的浪潮中展现出了它的身影,但是就目前的物联网环境中,网络问题仍旧是一个比较突出的硬伤.众所周知,在当前的物联网规划中,与其说是实现万物互联,倒不如说是行业指标数据监控.对于一些特 ...
随机推荐
- 08- Tomcat入门与环境搭建部署
环境搭建:网站文件(开发人员提供),相关软件(web服务器,应用服务器,数据库软件),硬件(服务器设备上),网络环境. 开发人员提供:部署文档说明书(操作系统版本,硬件配置,服务器软件及相关版本,部署 ...
- JavaScript动态设置div的样式的方法
有时候需要根据需要动态设置div的样式,当然对于稍有经验的javascript开发者来说,这一切都是那么的简单,但是对于初学者或者说没有相关经验的开发者来说可能就是一个不大不小的难关,下面就通过实例简 ...
- hdu4279 找规律+小想法
题意: 蛋疼的题意,最后是泽神给我讲的题意,题意是对于一个数来说,如果他不能整除另一个数同时他和另一个数非互质,那么另一个数就是这个数的特别数,如10 的特别数有 4 6 8三个,同时题目还 ...
- hdu4814 模拟(黄金分割进制转换)
题意: 给你一个十进制数,让你把他转化成Q进制数,Q是黄金分割比 = (1+√5)/2. 思路: 首先要明确的就是虽然q是实数,但是依然可以转换成q进制数,因为任何数num, ...
- 缓冲区溢出分析第06课:W32Dasm缓冲区溢出分析
漏洞报告分析 学习过破解的朋友一定听说过W32Dasm这款逆向分析工具.它是一个静态反汇编工具,在IDA Pro流行之前,是破解界人士必然要学会使用的工具之一,它也被比作破解界的"屠龙刀&q ...
- hdu4740 不错的简单搜索
题意: 给你一个n*n的图,给你驴和老虎的初始坐标和方向,已知他们的速度相同,他们走动的时候都是走直线,如果不能走,驴往右拐,老虎往左拐,如果拐了一次还走不了就原地不动,问他们的最早相遇位置 ...
- Linux中的SSH服务
目录 SSH 使用scp在两台Linux间传数据: 基于SSH做远程访问,可以使用ftp服务的相关指令sftp root@192.168.10.10 Openssh公私钥验证: SSH SSH(Sec ...
- HTTP参数污染(HPP)漏洞
HPP(HTTP参数污染) HPP是HTTP Parameter Pollution的缩写,意为HTTP参数污染.原理:浏览器在跟服务器进行交互的过程中,浏览器往往会在GET/POST请求里面带上参数 ...
- Intel汇编语言程序设计学习-第五章 过程-下
5.3.3 库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...
- 『居善地』接口测试 — 6、Httpbin服务介绍
目录 1.Httpbin服务介绍 2.在Windows系统中部署Httpbin服务 3.在Linux系统中部署Httpbin服务 4.Httpbin访问方式 5.Httpbin常用调试接口 6.总结: ...