OTA更新系统(一)

OTA(Over-The-Air)更新对于物联网(IoT)系统非常重要,在整个物联网系统中,各个设备的控制方式、编程语言、配置文件往往有着十分巨大的区别。本文旨在探索出一种高可用性、低耦合性的物联网升级结构。

这篇文章为系列第一篇,旨在介绍整个架构系统

一、更新包设计

由于各个设备(模块)之间的差异较大,我们需要一种特殊的打包方式,在保留文件各方面关系与属性的情况下对整个文件夹进行传输;同时,为了保证能方便地读取更新包的各类信息,例如版本号、包名、前后启动等方式,我们需要将文件格式进行一定程度的规范修改。

1.更新包

在打包方式方面,我们选择了tar这一文件归档类型。相比于其他的压缩类型,tar类型的压缩率不高,但是其能完整保留所归档文件的属性,例如Linux文件的权限等。

2.打包方式

开发者可通过提供的Python脚本进行打包,假设脚本为pack.py

1
python3 pack.py FOLDER

也可以手工进行tar打包

3.上传包

开发者可通过提供的Python脚本进行上传,假设脚本为update.py

1
python3 update.py ***.tar -c config.json

config.json文件如下:

1
2
3
4
5
6
7
{
"host":"127.0.0.1:8888",
"localPath":"/home/code801/test",
"name":"test",
"branch":"release",
"version":"1.0.0"
}

开发者也可以通过PUT方式向服务器提交更新包

Body部分采用form-datakeyfileValue是本地文件,即可上传更新包

上传之后,服务器会对上传的文件进行归档处理(计算MD5值,并放入文件服务器中),并更新数据库

更新otafiles表,加入对应名称,版本号,分支的文件

二、整体设计

1、OTA服务器

服务器分为三大系统,分别是API系统、文件服务器系统、数据库

(1)API系统

API地址 方法 参数 返回值 说明
/test GET - status:200 服务器是否联通
/maxVersion GET - package
- branch
- status:200
- version:
获取该包的分支的最大版本
/currentVersion GET - package
- branch
- status:200
- version:
获取场景中该包的分支的当前版本
/getVersion GET - package
- branch
- version
- status:200
- content:(json格式)
获取特定包、特点分支、特定版本的
更新包的MD5值
/updateVersion GET - package
- branch
- version
- status:200 通知服务器,场景中的该包的分支已更新
到指定版本
/upload PUT 如上文上传包章节 如上文上传包章节 开发者上传更新包

(2)文件服务系统

1
2
3
4
5
6
7
- OTA
- test
- 81dc9bdb52d04dc20036dbd8313ed055
- 188c104ee21e74a248d283ea86e2d252
- update
- 90ef339152a66aedbcd168122af460bd
- 5d0bd39db20922e24d74a889ebe953d1

(3)数据库

数据库分为三张表

一张表package,记录当前OTA服务器维护的所有包以及所有分支,以及当前设备上的版本号

字段:

字段名 说明
id INT 序号
package VARCHAR 包名
branch VARCHAR 分支名
version VARCHAR 当前场景中的版本号

一张表otafiles,记录OTA服务器上的所有文件,以及MD5值

字段:

字段名 说明
id INT 序号
package VARCHAR 包名
branch VARCHAR 分支名
version VARCHAR 版本号
content VARCHAR 该包该分支该版本号的更新包的MD5值
(可根据该MD5值去文件服务器下检索更新包)

一张表device,用于记录场景内的所有接受更新的设备的IP

字段:

字段名 说明
id INT 序号
name VARCHAR 设备名
ip VARCHAR IP地址

2、开发端

开发者可通过提供的Python脚本进行打包,假设脚本为pack.py

1
python3 pack.py FOLDER

也可以手工进行tar打包

开发者可通过提供的Python脚本进行上传,假设脚本为update.py

1
python3 update.py ***.tar -c config.json

config.json文件如下:

1
2
3
4
5
6
{
"host":"127.0.0.1:8888",
"name":"test",
"branch":"release",
"version":"1.0.0"
}

开发者也可以通过PUT方式向服务器提交更新包

Body部分采用form-datakeyfileValue是本地文件,即可上传更新包

上传之后,服务器会对上传的文件进行归档处理(计算MD5值,并放入文件服务器中),并更新数据库

更新otafiles表,加入对应名称,版本号,分支的文件

3、设备端

设备端可选择两种更新方式,

第一种为自动更新,定时与服务器进行通讯获取最新版本号,如果设备上落后版本,那么自动进行更新

第二种为手动更新,接受从服务器发来的指令,进行更新

在启动更新流程后,

设备访问OTA服务器的/getVersion获取对应包设备的更新包的MD5值,然后根据MD5值去文件服务器下下载更新包,下载完后进行校对

执行设备的更新前脚本

将更新包解压并覆盖原先文件

执行设备的更新后脚本

如果中途无错误,更新完成后向服务器报告该设备当前的版本号

如果更新失败,向服务器返回更新失败讯息

具体情况:

一个daemon程序,维护一个小型的http服务器,负责从服务器接受指令并上传更新情况。

另有一个json文件记录设备上所有包的位置

例如data.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"packages": [
{
"name": "test",
"version": "1.0.0",
"branch": "x86-major",
"localPath": "/home/code801/test",
"remoteUrl": "http://127.0.0.1:8080"
},
{},
{}
],
"UpdateType": "manual"
}

三、更新流程

1.发送更新请求

2

2.设备更新

3

3.更新完成

4