OTA-Docker架构设计&源码

2023-11-11

架构设计

Docker容器的主要任务:运行所需的应用程序

Docker容器映射文件目录:完成与本地文件共享数据,OTA-Client控制共享文件目录下的更新和容器的重启

最终实现基于Docker的SOTA应用升级。

整体架构的设计思路如下

  1. 终端需要一个OTA-Client,云端需要一个OTA-Server;
  2. 云端OTA-Server负责上传新文件,终端的OTA-Client负责订阅OTA-Server的更新文件;
  3. 终端的OTA-Client负责接收更新文件,将更新文件放在映射目录(终端和容器共享数据目录)下;
  4. 当终端的OTA-Client接收完成更新文件后,检测当前镜像是否有容器在运行,如果没有容器运行,则绑定映射目录启动容器,自运行启动脚本;如果有容器运行,则关闭当前运行容器,再绑定映射目录启动容器,自运行启动脚本;
  5. 当终端的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,后面的目录是容器内目录。

注意:容器目录不可以为相对路径;宿主机目录如果不存在,则会自动生成。

这样即可在容器内操作挂在在宿主机目录下的文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OTA-Docker架构设计&源码 的相关文章

  • 打印 scrapy 请求的“响应”

    我正在尝试学习 scrapy 在遵循教程的同时 我正在尝试进行细微的调整 我想简单地从请求中获取响应内容 然后我会将响应传递到教程代码中 但我无法发出请求并获取响应内容 建议就好 from scrapy http import Respon
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • 在wxpython中使用wx.TextCtrl并在按钮单击后显示数据的简单示例 - wx新手

    我正在学习 python 并尝试使用 wxpython 进行 UI 开发 也没有 UI exp 我已经能够创建一个带有面板 按钮和文本输入框的框架 我希望能够在文本框中输入文本 并让程序在单击按钮后对输入框中的文本执行操作 我可以获得一些关
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • 使用入口点脚本初始化 influxdb2 存储桶

    我正在部署用于存储实时数据的 influxdb 我已经使用 1 8 4 一段时间了 最 近决定更新到 v2 My docker compose yml文件看起来像这样 influxdb image influxdb 2 0 4 alpine
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • WindowsError:[错误 5] 访问被拒绝

    我一直在尝试终止一个进程 但我的所有选项都给出了 Windows 访问被拒绝错误 我通过以下方式打开进程 一个python脚本 test subprocess Popen sys executable testsc py 我想杀死那个进程
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • 卷麻了,00后测试用例写的比我还好,简直无地自容.....

    前言 作为一个测试新人 刚开始接触测试 对于怎么写测试用例很头疼 无法接触需求 只能根据站在用户的角度去做测试 但是这样情况会导致不能全方位的测试APP 这种情况就需要一份测试用例了 但是不会写 求指教 还有就是测试出来的bug该如何追踪
  • Prometheus Node_exporter 之 Node Exporter

    Node Exporter 1 Node Exporter Scrape Time type GraphUnit secondsLabel Seconds collector 各个收集器持续时间metrics node scrape col
  • 安全SaaS,在中国TO B中艰难成长

    无论是一体化 还是以业务为中心专攻政企或金融客户 还是针对中小微企业市场推出免费产品 都可能成为未来安全SaaS规模化的发展路径 作者 斗斗 编辑 皮爷 出品 产业家 5G 物联网 AI 云计算等技术的应用 让生产 服务过程加速数字化 云化
  • 【Qt】UI显示中文

    QT UI显示中文的三种方法 最近在用Qt做项目 遇到UI不能显示中文的问题 发现有3种方法可以解决 先记录一下 方法一 QString fromLocal8Bit 你好中国 1 方法二 QStringLiteral 你好中国 1 方法三
  • cmake 报错

    目录 错误 原因 错误 The C compiler identification is unknown The CXX compiler identification is unknown CMake Error at CMakeList
  • Android加载圆形(圆角)图片的方式总结(RoundedBitmapDrawable、Glide)

    一 问题引入 Android开发中经常要使用到ImageView 而ImageView控件自带的宽度width 高度height等属性无法让ImageView呈现出圆形 圆角这样的形状 相信很多小伙伴都和我一样为这个问题苦恼 现在介绍几种方
  • 2022如何做副业?35岁前,千万别让死工资绊住你赚钱的步伐

    近年来互联网行情下降 好多人都在思考要不要搞个副业来抵御风险 这不又来事了 这两天又爆了互联网大裁员 继阿里 向社会输送人才 之后 京东又搞了个 毕业礼 整的小伙伴们人心惶惶 副业的关注度又一波升级 那今天我们就来聊聊 程序员做副业这件事
  • 【计算机视觉

    文章目录 一 检测相关 11篇 1 1 BandRe Rethinking Band Pass Filters for Scale Wise Object Detection Evaluation 1 2 Morphological Ima
  • java 静态代理和动态代理

    什么是代理 从字面意思来说 代理就是代替处理的意思 从程序层面来说 代理就是代替某个程序 处理某个事情 静态代理 场景1 小明需要买基金 public class Main public static void main String ar
  • NFS服务高可用方案

    文章目录 NFS服务高可用方案 1 简述 2 硬件和网络需求 3 安装 DRBD 3 1 安装DRBD 3 2 编辑配置文件 3 3 初始化设备 4 NFS服务安装 4 1 安装服务 4 2 配置 5 安装heartbeat 5 1 安装
  • linux 查看文件夹大小

    du sh 查看当前目录下的文件夹大小 du 命令 用途 概述磁盘使用 语法 du a s k m g l r x H L File 描述 du命令显示用于文件的块的数量 如果指定的File参数实际上是一个目录 就要报告该目录内的所有文件
  • webpack+ES6+SuperMap iClient for MapboxGL学习笔记

    一 基本介绍 1 SuperMap iClient for MapboxGL 介绍 SuperMap iClient for MapboxGL 是一套基于 MapboxGL 的云 GIS 网络客户端开发平台 支持访问 SuperMap iS
  • 概率图模型 Probabilistic Graphical Model(PGM)

    什么是概率图模型 机器学习的方法很多时候是在计算联合分布 之后在联合分布上做一系列的推理 一般的联合分布定义较为复杂 如有n个随机变量的分布X 对于该分布通常十分复杂 参数量巨大 即便是在最简单的二值分布下也有个参数 参数量巨大通常意味着模
  • 用Python做一个窗口

    import pygame 导入pygame库 pygame init pygame组件初始化 pygame display set caption 我的第一个窗口 设置窗口名称 height 600 窗口高度变量 width 400 窗口
  • UVM::phase的run order

    1 build time bulid connect end of elaboration 2 run time start of simulation run run有分为 pre reset reset post reset pre c
  • DVWA——CSRF(low)

    CSRF 界面 源代码
  • 正点原子STM32(基于HAL库)1

    正点原子B站视频地址 https www bilibili com video BV1bv4y1R7dp p 1 vd source cc0e43b449de7e8663ca1f89dd5fea7d 目录 单片机简介 Cortex M介绍
  • PAT 1033 旧键盘打字 (20分) python实现

    旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 代码 如下
  • 刷脸支付各行业有发挥一技之长的地方

    刷脸支付的技术在各方的监督下不断发展 安全性也被大大提高 引用范围愈发广泛 零售 教育 金融 安防 医疗等 都是刷脸支付可以发挥一技之长的地方 只有你想不到 没有刷脸支付触达不到 应广大家长和学生的要求 刷脸支付如今正肆无忌惮的入驻校园 帮
  • OTA-Docker架构设计&源码

    架构设计 Docker容器的主要任务 运行所需的应用程序 Docker容器映射文件目录 完成与本地文件共享数据 OTA Client控制共享文件目录下的更新和容器的重启 最终实现基于Docker的SOTA应用升级 整体架构的设计思路如下 终