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

针对城乡公交站牌显示终端现场升级与维护困难的问题,提出了一种基于应用程序(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.mzph.cn/news/23553.shtml

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

相关文章

Gradle-02:问题Plugin with id ‘maven‘ not found

1. 背景 在一次使用 Gradle 构建自己项目,完事,需要上传到本地 Maven 仓库,因为事先并不清楚 apply plugin: maven 插件已经被 Gradle 移除,找了一圈,才找到解决方案。 2. 原因 apply plugin: maven def localRepo f…

Statefulset 实战 1

上一部分与大家分享到 Statefulset 与 RplicaSet 的区别,以及 Statefulset 的特点,能做的一些事情及一些注意事项 现在我们来尝试使用 Statefulset 来部署我们的应用,我们可以需要有应用程序,然后有持久化卷 开始使用 Statefuls…

Cocos creator(2d) 使用 shader + uv 实现单张图片衔接滚动效果

在游戏中,当我们需要让背景图片无缝衔接无限滚动时(打飞机这种背景一直滚动,或者肉鸽游戏地图一直在走等等),通常的做法是 在游戏中放两个背景node,在update中控制这两张背景图片的移动,并让其收尾衔接即可。(具体代码…

奥威BI系统|秒分析,更适合分析大数据

根据以往的经验,当数据量多到一定程度就容易导致系统卡顿、崩溃。这种现象给企业级数据分析造成了极大的困扰。随着业务发展扩大和分析需求精细化,企业需要一套能秒分析大数据的系统。而奥威BI系统就是这样一款可以秒分析大数据的商业智能系统。 奥威BI…

考研408 | 【计算机网络】概述

计算机网络体系结构 计算机网络概述:1.概念,组成,功能,分类2.标准化工作及相关组织3.性能指标体系结构&参考模型:1.分层结构2.协议,接口,服务3.ISO/OSI模型4.TCP/IP模型 目录 计算机网络体…

外卖多门店小程序开源版开发

外卖多门店小程序开源版开发 外卖多门店小程序开源版的开发可以按照以下步骤进行: 确定需求:明确外卖多门店小程序的功能和特点,包括用户注册登录、浏览菜单、下单支付、订单管理等。技术选型:选择适合开发小程序的技术框架&…

七、Spring 面向切面编程(AOP)学习总结

文章目录 一、初识面向切面编程(AOP)1.1 什么是 AOP1.2 AOP的应用场景1.3 Aop 在 Spring 中的作用1.3.1 Aop 的核心概念 1.4 使用 Spring 实现 AOP1.4.1 方式一:使用 Spring API 接口实现 AOP 【主要是SpringAPI接口实现】1.4.2 方式二&#…

掌握主动权:职场中如何主动寻找并拓宽工作领域

引言 在现代职场的竞争环境中,主动性是一种重要的优势。对于企业而言,员工的主动性是其成功的关键因素之一。而对于个人职业发展来说,主动性能帮助我们把握更多的机会,提升我们的职业能力。因此,学会在职场中主动寻找…

mybatisJava对象、list和json转换

1. 参考mybatis-plus mybatis Java对象、list和json转换 网上好多不靠谱,参考mybatis-plus中TableField,mybatis中自定义实现 这样不需要对象中属性字符串接收,保存到表中,都是转义字符,使用时还要手动转换为对象或者…

车载总线系列——J1939三

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人…

Golang之路---04 并发编程——信道/通道

信道/通道 如果说 goroutine 是 Go语言程序的并发体的话,那么 channel(信道) 就是 它们之间的通信机制。channel,是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道,我把他叫做信道,也有人将…

PLC4X踩坑记录

plc4x引起的oom 使用Jprofiler查看dump文件 由上可以看出有大量的NioEventLoop对象没有释放 PlcConnection#close 设备断连重连后导致的oom,看源码close方法主要是channel通道关闭。 修改NettyChannelFactory源码 plc4x设计思想是一个设备一个连接,…

k8s ingress获取客户端客户端真实IP

背景 在Kubernetes中,获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中,原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点: 安全性:基于客户端IP进行访问控制和认证授…

工厂模式(C++)

定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。 应用场景 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类…

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本 引言 在 Java 生态系统中,Spring Boot、Spring Cloud 和 Spring Alibaba 是非常流行的框架,它们提供了丰富的功能和优雅的解决方案。然而,随着不断的发展和更新&…

【ARM Coresight 系列文章 2.3 - Coresight 寄存器】

文章目录 Coresight 寄存器介绍1.1 ITCTRL,integration mode control register1.2 CLAIM寄存器1.3 DEVAFF(Device Affinity Registers)1.4 LSR and LAR1.5 AUTHSTATUS(Authentication Status Register) Coresight 寄存器介绍 Coresight 对于每个 coresight 组件&am…

架构训练营学习笔记:5-3接口高可用

序 架构决定系统质量上限,代码决定系统质量下限,本节课串一下常见应对措施的框架,细节不太多,侧重对于技术本质有深入了解。 接口高可用整体框架 雪崩效应:请求量超过系统处理能力后导致系统性能螺旋快速下降 链式…

STM32CubeMx之FreeRTOS的中断优先级+配置

编译运行即可 例如我编写的是一个灯亮500ms 一个等200ms的亮灭 如果他们的优先级是同等的,那么任务都可以实现,时间片会自动切换 但是如果亮500ms的灯 任务优先级更高 还用HALdelay的话 就会让任务二饿死,从而就会只看到任务一的内容 解…

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-BiGRU蛇群算法…

Cilium系列-13-启用XDP加速及Cilium性能调优总结

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…