面向城乡公交的嵌入式系统远程升级设计方案

news2024/11/16 12:34:38

针对城乡公交站牌显示终端现场升级与维护困难的问题,提出了一种基于应用程序(IAP)技术的嵌入式系统远程升级设计方案。

通过IAP技术配合改良过的远程升级程序代替传统的现场烧写调试,节约了奔赴现场调试的时间和成本。

针对远程升级过程中被恶意攻击、固件文件安全传输和可靠更新等安全性问题,提出利用分包校验和设置临时程序存储区域的方法。

采用多服务器协同设计和严格权限管理方式,在服务器端通过权限管理来提升升级操作过程中的安全性。

引言

公共交通智能化是当前的大趋势,安装于村镇道路旁的城乡公交站牌显示终端能实时显示公交车到离站信息,到站距离,能极大地方便老百姓的公交出行。

传统的升级方式通过预留的升级接口,通过切换BOOT模式使用串口或者JLINK接口来进行升级。

城乡公交站牌安装点位偏远、分散,要实现设计缺陷修补、功能改进或
性能提升等需求,需要到现场拆卸设备,增加了维护成本。

本设计在利用城乡公交站牌显示终端现有的数据链路的基础之上,通过协议的扩展,实现远程升级固件。
提高了嵌入式设备的可维护性,并通过多服务器协同和严格的权限管理机制,提升了升级过程中的安全性,通过CRC加密算法和断点续传机制,保证了升级文件的可靠性。

系统组成

在这里插入图片描述
本文的升级系统由业务服务器、站牌显示终端和升级服务器三部分组成。

业务服务器通过与站牌显示终端的网络连接,实现车辆到站的信息发布。

升级服务器在业务服务器发起升级请求后,响应站牌显示终端的升级请求,实现升级数据的下发。

站牌显示终端通过4G网络登录业务服务器,接收业务服务器下发的数据。

城乡公交站牌显示终端由微控制器(MCU GD32F103RB)、4G无线模块(移远EC20)、数码管显示驱动单元、实时时钟、供电单元等组成,主要实现上报数据和接收服务器下发的车辆到离站信息等功能。

在这里插入图片描述
远程升级功能是利用城乡公交站牌显示终端本身具有的网络连接特性,通过网络协议的接口,实现对站台显示终端的固件程序的更新:即更新微控制器MCU内部的程序,以达到改进和提升的目的。

升级原理

GD32F330 MCU是兆易创新公司推出的基于Cortex®-M4内核的微控制器[3][4],是国产自主品牌的32位MCU,集成外设单元丰富、性能强劲,成本低廉,是替换STM32系列MCU的首选。本文选择GD32F330RB作为站牌显示终端的主控MCU。

微处理器的编程方法通常有两种:通过串口或者JTAG等接口进行编程的在系统编程(In System Programming,ISP)模式、在应用程序控制下的在应用编程(In Application Programming,IAP)模式。

本设计采用的预先将Bootloader程序+应用程序通过ISP方式下载到终端作为出厂程序,出厂后通过IAP模式对程序进行升级。IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写。

本系统设计两个程序[7]:Bootloader(引导加载程序)和App
(应用程序)。

Bootloader程序不执行应用的功能操作,只负责在开机启动时对系统升级数据进行更新,并跳转到对应的App程序。App程序为用户功能代码,执行用户功能操作,同时接收服务器的升级请求,将升级代码数据保存到特定的FLASH位置。

本系统中使用的芯片GD32F330RB的FLASH存储器大小是128K,此空间被划分为三大块,分别用于运行Bootloader程序,APP程序1,APP程序2。

其中0x801E000-0x801f000这4K空间用来存储升级相关的环境变量,包括升级标志、数据长度,CRC32校验后的校验码。
在这里插入图片描述

Bootloader设计

Bootloader程序是本方案的核心,需要完成升级文件检测,程序校验,固件更新以及程序跳转等功能。
在这里插入图片描述

  1. 微处理器上电/复位后,从地址0x08000000开始运行Bootloader程序。
  2. Bootloader完成MCU的初始化,然后从0x0801E0000地址读取环境变量。
  3. 根据环境变量中的升级标志位来判断是否要进入程序升级模式。
  4. 如果不需要升级,读出需要跳转的程序入口地址,执行程序跳转操作,跳转到0x08002000(APP1程序区)处开始运行应用APP;如需要升级,进入升级流程,进行APP代码的更新。
  5. 在升级流程中,首先读取环境变量中的待升级程序的长度和CRC校验码,并计算APP2程序区地址中的存储的程序的CRC32的校验码,与环境变量中的校验码进行比对。
  6. 校验码一致的话进入FLASH操作流程,根据需要对FLASH扇区进行擦除,然后从APP2对应的位置读取程序数据写入APP1对应的位置;校验码不一致的话,放弃升级。
  7. 升级完成或者升级失败均需要清除升级标志位,然后软复位MCU。

通信协议设计

与服务器通信,需要遵循一定的通信协议,才能正确的进行升级。
当前采用的连接为TCP长连接,大端模式的网络字节序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了降低远程传输数据出现的误码率,把升级固件分成小包进行传输。
固件数据包的分包长度设置为256个字节,分包序号表示当前传输的数据包是第几包,当出现传输错误,帧数据包校验不正确时,会返回错误接收的数据包给服务器,服务器根据分包序号,重新发送此分包的数据包。终端正确接收了当前的分包,给服务器返回成功的应答信号,服务器发送下一个分包,直到固件数据发送完成。

APP程序设计

APP程序是实现终端功能的软件。本终端主要实现的功能是验证登录业务服务器和接收服务器下发的车辆到离站信息,并在终端的LED上显示公交车到站距离。

将APP2区的(0x0801E0000)开始的一个扇区用来存储升级程序的环境变量,主要包括程序是否需要升级的标志信息,程序的长度和校验码。

Bootloader运行后首先读取0x0801E000位置处的环境变量,判断程序是否需要升级。如果程序需要升级,就需要根据环境变量中存储的程序长度和校验码对APP2区的程序进行CRC校验,判断校验码是否与环境变量中的校验码一致,若不一致,则清除环境变量的升级标志,跳转到APP1执行;若一致,则擦除APP1程序区,将APP2程序区的数据拷贝到APP1程序区。拷贝完成以后,清除环境变量的升级标志,跳转到APP1执行。

在这里插入图片描述
固件升级的安全关系到整个系统的安全,因为固件将彻底的替换掉终端正在运行的程序。因此需要从几个方面来保证新的固件程序在下发升级以后,不会造成系统的大面积崩溃。

  1. 需要保证新版本的固件程序经过了严格的测试才能上传到服务器中。
  2. 要保证新版本的固件程序拥有再次升级的功能,这样在出现bug或者错误以后,可以迅速进行升级补救。
  3. 分批次进行升级,保证升级后的设备运行稳定,无故障,再扩大升级规模。
  4. 固件程序升级过程中,实行Bin文件加密校验,保证升级固件的完整性。
  5. 提升服务器的安全等级,防范内部或者外部的恶意攻击。

终端开机后主动连接业务服务器,根据JT808协议,完成终端设备的注册、登录,并根据业务服务器下发的到站信息数据,在本地LED上实现车辆信息的显示。如果需要对新版本的固件进行升级,则开启升级流程。

  1. 上传经过测试的BIN文件到业务服务器,业务服务器经过身份认证和密码验证,确认上传的文件合法,并将BIN文件同步到升级服务器。
  2. 在业务服务器的终端升级管理页面选择需要升级的终端设备,下发升级命令,根据待升级终端的数量来进行身份认证。在大于5台待升级设备时,需要请求更高的系统权限。
  3. 业务服务器给终端发送升级命令,包括升级服务器的IP和端口号。
  4. 终端主动断开与业务服务器的网络连接,根据下发的升级服务器IP和端口号,连接升级服务器,连接过程中会发送自己的终端ID和当前版本给升级服务器。
  5. 升级服务器确认终端的版本与待升级的版本都正确无误后,发送新版本固件程序的固件程序大小,CRC校验码等信息给终端,在收到终端的确认信息后,开始分包发生固件信息给终端。
  6. 终端根据协议,对分包数据进行校验,校验无误后,写入FLASH中对应的存储区域。每接收完一帧数据,向升级服务器请求下一段数据。若是校验出错或者是网络中断,将会重复请求未接收完成的数据,实现断点续传。
  7. 在终端接收到最后一帧数据并写入FLASH之后,将根据最开始接收到的程序大小和CRC校验码对整个写入FLASH的程序文件进行校验。在校验无误后,置位环境变量中升级标志。
  8. 断开与升级服务器的网络连接,软复位MCU。复位后执行Bootloader里的程序更新操作,程序更新后,跳转到APP1程序运行。
  9. 终端连接业务服务器,在注册登录过程中上报自己的终端ID和版本信息。并根据业务服务器下发的命令实现基本功能。此时在业务服务器上将显示当前终端的版本信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/838485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django使用uwsgi+nginx部署,admin没有样式解决办法

Django使用uwsginginx部署,admin没有样式解决办法 如果使用了虚拟环境则修改nginx.conf文件中的/static/路径为你虚拟环境的路径,没有使用虚拟环境则改为你python安装路径下的static server {listen 8008;server_name location; #改为自己的域名,没域名…

嵌入式开发学习(STC51-8-IO扩展-串转并)

内容 通过74HC595模块控制LED点阵,以一行循环滚动显示 74HC595简介 51单片机IO口非常有限,如果想要连接更多外围设备,可以通过IO扩展来实现;其中一种IO口扩展方式-串转并,使用的芯片是74HC595; 1个74HC…

LiveGBS流媒体平台GB/T28181常见问题-无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

LiveGBS无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.…

HTML5注册页面

分析 注册界面实际上是一个表格&#xff08;对齐&#xff09;&#xff0c;一行有两个单元格。 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevic…

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒&#xff0c;左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…

【单片机】51单片机,TLC2543,驱动程序,读取adc

TLC2543 是一款 12 位精密模数转换器 (ADC)。 1~9、11、12——AIN0&#xff5e;AIN10为模拟输入端&#xff1b; 15——CS 为片选端&#xff1b; 17——DIN 为串行数据输入端&#xff1b;&#xff08;控制字输入端&#xff0c;用于选择转换及输出数据格式&#xff09; 16——…

完全背包问题

题目链接 题意&#xff1a;在01背包的基础上多了每个物品都可以无限取的条件 思路&#xff1a;首先考虑在01背包的基础上的暴力枚举&#xff0c;我们可以在枚举前i件物品最多拿j的容量时再遍历当前物品拿的数量 贴一个暴力tle代码&#xff1a; #include<bits/stdc.h> #d…

线程间的同步、如何解决线程冲突与死锁

一、线程同步概念&#xff1a; 线程同步是指在多线程编程中&#xff0c;为了保证多个线程之间的数据访问和操作的有序性以及正确性&#xff0c;需要采取一些机制来协调它们的执行。在多线程环境下&#xff0c;由于线程之间是并发执行的&#xff0c;可能会出现竞争条件&#xf…

VUE框架:vue2转vue3全面细节总结(2)导航守卫

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

学习源码,模仿编程

一.观察者模式: 1.创建事件 2.发布事件 3.监听事件 4.效果: 二.模板方法模式

【云原生】使用kubeadm搭建K8S

目录 一、Kubeadm搭建K8S1.1环境准备1.2所有节点安装docker1.3所有节点安装kubeadm&#xff0c;kubelet和kubectl1.4部署K8S集群1.5所有节点部署网络插件flannel 二、部署 Dashboard 一、Kubeadm搭建K8S 1.1环境准备 服务器IP配置master&#xff08;2C/4G&#xff0c;cpu核心…

如何下载和编译 Android 源码?

本文为洛奇看世界(guyongqiangx)原创&#xff0c;转载请注明出处。 文章链接&#xff1a;https://blog.csdn.net/guyongqiangx/article/details/132125431 网上关于如何下载 Android 源码和编译的文章很多&#xff0c;其中最常见的就是 Android 官方文档&#xff1a; 下载源代码…

前端js--扩展卡片

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet" href"…

谈一谈Python中的装饰器

1、装饰器基础介绍 1.1 何为Python中的装饰器&#xff1f; Python中装饰器的定义以及用途&#xff1a; 装饰器是一种特殊的函数&#xff0c;它可以接受一个函数作为参数&#xff0c;并返回一个新的函数。装饰器可以用来修改或增强函数的行为&#xff0c;而不需要修改函数本身…

使用JProfiler进入JVM分析

要评测JVM&#xff0c;必须将JProfiler的评测代理加载到JVM中。这可以通过两种不同的方式发生&#xff1a;在启动脚本中指定-agentpath VM参数&#xff0c;或者使用attach API将代理加载到已经运行的JVM中。 JProfiler支持这两种模式。添加VM参数是评测的首选方式&#xff0c;集…

拥抱创新:用Kotlin开发高效Android应用

拥抱创新&#xff1a;用Kotlin开发高效Android应用 引言 在当今数字时代&#xff0c;移动应用已经成为人们生活中不可或缺的一部分。无论是社交媒体、电子商务还是健康管理&#xff0c;移动应用已经深刻地影响了我们的生活方式。随着移动设备的普及和功能的增强&#xff0c;A…

【JAVA】类和对象

作者主页&#xff1a;paper jie的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

高项V4.高级PM.项目集set+项目组合portfolio+组织级OPM+量化项目管理+实践模型

PMI &#xff0c; ITSS 、CMMI 和PRINCE2 等为各类信息系统项目管理提供了最佳实践&#xff0c;井提供了对组织的项目管理能力进行持续改进和评估的方法。 第一部分 项目集--《项目集管理标准>> (第4 版) ---实现项目11>2的更大效益 由项目管理协会(PMI) 出版的《…

OpenCV之信用卡识别实战

文章目录 代码视频讲解模板匹配文件主程序(ocr_template_match.py)myutils.py 代码 链接: https://pan.baidu.com/s/1KjdiqkyYGfHk97wwgF-j3g?pwdhhkf 提取码: hhkf 视频讲解 模板匹配文件 主程序(ocr_template_match.py) # 导入工具包 from imutils import contours # 从…

算术逻辑单元(ALU)(数电、加法器)

优先级&#xff1a;与>或 异或电路 依旧需要一级级的传递&#xff0c;后算完才能前传