OTA更新系统(一)
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 | { |
开发者也可以通过PUT
方式向服务器提交更新包
Body
部分采用form-data
,key
是file
,Value
是本地文件,即可上传更新包
上传之后,服务器会对上传的文件进行归档处理(计算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 | - OTA |
(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 | { |
开发者也可以通过PUT
方式向服务器提交更新包
Body
部分采用form-data
,key
是file
,Value
是本地文件,即可上传更新包
上传之后,服务器会对上传的文件进行归档处理(计算MD5值,并放入文件服务器中),并更新数据库
更新otafiles
表,加入对应名称,版本号,分支的文件
3、设备端
设备端可选择两种更新方式,
第一种为自动更新,定时与服务器进行通讯获取最新版本号,如果设备上落后版本,那么自动进行更新
第二种为手动更新,接受从服务器发来的指令,进行更新
在启动更新流程后,
设备访问OTA服务器的/getVersion
获取对应包设备的更新包的MD5值,然后根据MD5值去文件服务器下下载更新包,下载完后进行校对
执行设备的更新前脚本
将更新包解压并覆盖原先文件
执行设备的更新后脚本
如果中途无错误,更新完成后向服务器报告该设备当前的版本号
如果更新失败,向服务器返回更新失败讯息
具体情况:
一个daemon
程序,维护一个小型的http服务器,负责从服务器接受指令并上传更新情况。
另有一个json
文件记录设备上所有包的位置
例如data.json
:
1 | { |