架构设计
Docker容器的主要任务:运行所需的应用程序
Docker容器映射文件目录:完成与本地文件共享数据,OTA-Client控制共享文件目录下的更新和容器的重启
最终实现基于Docker的SOTA应用升级。
整体架构的设计思路如下
- 终端需要一个OTA-Client,云端需要一个OTA-Server;
- 云端OTA-Server负责上传新文件,终端的OTA-Client负责订阅OTA-Server的更新文件;
- 终端的OTA-Client负责接收更新文件,将更新文件放在映射目录(终端和容器共享数据目录)下;
- 当终端的OTA-Client接收完成更新文件后,检测当前镜像是否有容器在运行,如果没有容器运行,则绑定映射目录启动容器,自运行启动脚本;如果有容器运行,则关闭当前运行容器,再绑定映射目录启动容器,自运行启动脚本;
- 当终端的OTA-Client完成容器的重新启动后,即完成容器应用更新。
OTA协议选择
OTA(Over-The-Air)升级是一种通过无线网络实现远程设备升级的技术,具体实现需要遵循一定的协议标准。MQTT 和HTTP OTA都是常用的OTA升级协议。
下面将从以下几个方面详细分析并对比这两种协议:
传输协议 | MQTT 使用MQTT协议,而HTTP 使用HTTP协议。MQTT协议是一种轻量级的消息传输协议,适用于低带宽、高延迟、不可靠网络环境下的数据传输。HTTP协议则是一种基于请求-响应模式的协议,用于传输Web上的数据。在传输效率方面,MQTT 由于采用了轻量级的传输协议,数据传输效率要高于HTTP 。 |
适用场景 | MQTT 适用于需要快速响应和实时性要求较高的场景,如车联网等。MQTT协议的优点是可以大幅减少通信量、降低通信延迟,实现快速响应。而HTTP 更适用于在网络环境相对稳定的场景中进行升级。 |
安全性 | MQTT 可以通过加密和认证等措施提高升级过程的安全性,而HTTP 在传输过程中可能存在安全问题,需要采取额外的安全措施。例如,HTTPS可以提供数据加密和身份验证功能,从而更加安全。 |
OTA的实现方式 | MQTT 和HTTP 的实现方式略有不同。MQTT 通常使用MQTT消息队列作为升级包的传输通道,设备可以从MQTT Broker中订阅升级包。而HTTP 则通常使用HTTP服务器作为升级包的来源,设备可以通过HTTP请求下载升级包。 |
综上所述,MQTT 和HTTP 各有优缺点,具体应用需要根据场景和要求进行选择。如果要求传输效率高、响应速度快、安全性好,则可以选择MQTT ;如果网络环境相对稳定,可以选择HTTP OTA。在本文中,将MQTT 和HTTP 结合使用,从而兼顾两者的优点,MQTT 用于消息的发布和订阅,HTTP 用于web文件处理和传输。
MQTT服务搭建
MQTT适用于需要快速响应和实时性要求较高的场景,如车联网等。
主要用于消息的发布和订阅。
MQTT Broker 搭建
sudo apt-get update
sudo apt-get install mosquitto
pip install paho-mqtt
查看MQTT服务
systemctl status mosquitto.service
查看MQTT服务详细信息
mosquitto -v
通信测试
需要在客户端或本机安装mosquitto-clients
sudo apt-get install mosquitto-clients
mosquitto_pub -h 30.178.38.62 -t "wp/test" -m "l want the world\n" -u ellison -P 1
mosquitto_sub -h 30.178.38.62 -t "wp/test" -u ellison -P 1
HTTP服务搭建
开源代码:https://github.com/weipengyiyu/OTA-Docker
- 本机的OTA-Client接收服务端下发的更新文件,检测当前本机是否存在此文件,如果存在则删除本机文件,然后更新新文件;如果不存在,之间更新新文件;
- 在OTA-Server上传文件压缩包文件或者文件目录、文件;
- 在每一个终端上启动一个OTA-Client,PC端启动OTA-Server,采用分布式-发布订阅的方式进行升级。
服务端
需要配置IP,用户名和密码,以便客户端连接
"mosquitto_pub -h 30.178.38.62 -t 'wp/test' -m 'update file' -u ellison -P 1"
执行下面操作,即可进入HTTP服务端
python3 ota_server.py
进入服务端本地浏览器:http://127.0.1.1:8000/
其中dirtree.txt如下
directory tree
|____ota_client.py 3.25K
|____README.md 56B
|____dirtree.txt 325B
|____ota_server.py 22.46K
File Path File Size File Modify Time
README.md 56B 2023-05-13 19:19:42
dirtree.txt 325B 2023-05-14 13:21:44
ota_client.py 3.25K 2023-05-13 19:19:42
ota_server.py 22.46K 2023-05-13 19:19:42
选择需要更新应用程序,应用程序以*.tar.gz压缩文件的方式进行上传。当服务端接受完成文件后,会分别发布更新消息到订阅相关需要应用更新的Docker客户端,对应的客户端就会向服务端申请下载文件及更新本地Docker应用程序。
客户端
在执行客户端之前,需要对客户端进行需要更新的压缩文件名、IP 、用户名、密码、订阅的topic_name等相关配置。
在另一台或本机上执行
python3 ota_client.py
容器文件映射
"docker run -it -v /home/wp/ota-client:/root -d weipengyiyu/ubuntu:18.04"
这样在容器启动后,容器内会自动创建/root的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录/home/wp/ota-client,后面的目录是容器内目录。
注意:容器目录不可以为相对路径;宿主机目录如果不存在,则会自动生成。
这样即可在容器内操作挂在在宿主机目录下的文件。