一种基于BS架构的车载嵌入式系统维护软件的设计与实现*

2020-11-11 10:25李小勇闫迷军李洋涛
铁道机车车辆 2020年5期
关键词:视图路由嵌入式

郑 斌,李小勇,闫迷军,孔 元,李洋涛,

(1 北京纵横机电科技有限公司,北京 100094;2 中国铁道科学研究院集团有限公司 机车车辆研究所,北京 100081)

近年来,随着信息化、智能化、网络化的发展,嵌入式系统已经应用到社会公共服务的各个领域,轨道交通行业也不例外。在动车组上,几乎所有的车载设备都是单独的嵌入式系统,例如机车车辆上核心的嵌入式设备包括CCU、BCU、TCU、ACU、DCU、PIS等。这些车载设备的嵌入式软件除了要实现关键的控车逻辑,维护软件的功能也是必不可少的,通常维护软件的功能主要包括:固件上传、日志下载、故障记录下载、车辆数据状态的监视、车辆数据的设置、执行相关命令并返回结果等。

传统的车载嵌入式设备实现维护功能的方案主要有下面几种:

(1)完全基于串口命令行方式,车辆数据的获取,设置和展示都在命令行窗口实现;

(2)CS(Client-Server,简称CS)架构方式,客户端采用传统上位机图形化编程技术,例如MFC,QT,CSHARP等;

(3)基于MPA模式(Multi-Page-Application,简称MPA)设计的BS架构。

第1种方式的缺点很明显,即用户体验较差。第2种方式客户端和服务器之间需要约定私有的网络传输协议,通常定义成基于TCP的二进制传输协议,不利于维护软件的扩展和兼容。而且客户端软件的技术实现很难满足跨平台的需求,实际项目中维护软件通常只开发PC端的版本,无法满足移动端的使用需求。第3种方式是传统的桌面级web应用的设计方式,相比于SPA(Single-Page-Application,简称SPA)应用,MPA需要设计多个前端页面,用户的交互会导致页面跳转,页面跳转一方面会影响到用户体验,另一方面会增加和服务器的交互频率,增大网络带宽占用,不适合车载设备低网络带宽占用的应用需求和场景。

针对上述传统实现方案的缺陷,提出了一种前端采用SPA[1]方式、后端采用Mongoose的BS架构设计方案,整个设计方案采用MVC(Model-View-Controller)模式开发构建,该方案只需开发一套前端页面即可满足全平台的使用需求。方案如图1所示:

图1 一种基于SPA车载嵌入式系统维护软件BS架构方案

1 前端页面设计

车载嵌入式设备的硬件性能比桌面级计算机有较大的差距,因此前端页面的设计尽可能减少与后端服务器的交互。采用SPA方案进行前端页面的设计,每次功能页面的跳转只在本地进行,不与服务器进行http交互,同时为了兼容跨平台的用户体验,采用响应式布局,以保证在PC、平板、手机等不同级别的硬件平台上都能有较好的用户操作体验。

随着近几年互联网技术的迅猛发展,前端技术的发展也在不断的革新。尤其是以Vue、Angular、React 3大前端框架的出现将web前端带入组件化开发时代。

选用当下最流行的Vue作为项目前端模板,它是一种用于构建用户界面的渐进式框架,采用MVVM的设计理念,实现数据和UI的双向绑定。Vue简单易用,且可以灵活的和第3方库进行整合,非常适合构建SPA应用。

文中给出一种简约清晰的单页前端响应式布局方案,可同时适配电脑视图和手机视图,如图2所示。

图2 前端页面模板

如图2所示,左侧为功能菜单导航区,用户点击对应的功能菜单,则高亮选中的菜单,同时右侧区域展示对应的功能视图。由于Vue.js采用了组件化开发的设计理念,每一个组件均需要实现3部分功能:页面模板、js逻辑、css样式。本项目的前端设计也采用组件化方式进行设计开发。前端页面的根组件包含3个子组件,即头部组件、左侧导航组件、右侧内容展示组件。其中右侧内容展示组件随左侧导航菜单动态切换,需要为左侧导航菜单的每一个菜单项设计对应的组件,所有这些菜单功能组件共用右侧展示局域,具有排他性。整个前端的页面逻辑如图3所示。

图3 前端页面逻辑

传统单页面局部视图切换采用控制样式来实现视图的显示和隐藏,而且通常是将所有的视图和js逻辑写在一起,这种设计方式在模块化和扩展性方面都较差。使用了Vue提供的前端哈希路由机制配合组件化思路来实现局部视图的切换。核心思想是为每个功能菜单设计对应的哈希路由url,同时将该url与对应的组件相关联,最终会形成一张前端路由url和组件的对应关系表,当用户点击对应的左侧功能菜单,会触发前端路由url跳转(浏览器地址栏会有相应的显示,但是此时没有与后端服务器进行交互),结合前端路由表,Vue会自动实现对应组件的展示。

业务数据监视功能组件的主要功能是实时显示业务数据,实现方式采用主流的AJAX方式(一种和后端服务器异步交互,当前页面无跳转且局部刷新的技术),周期性调用API接口,获取对应的回复数据后,刷新该组件上的视图信息。由于Vue采用了MVVM(Model-View-ViewModel)的设计模式,因此只需在组件展示时,将整个组件上的所有动态数据和相关的UI元素做绑定,每次得到AJAX的回复数据后,Vue会自动实现界面元素的刷新。

2 前后端交互接口设计

前后端交互接口的设计采用Restful API[2]方式,如表1所示。Rest是一种软件设计风格,由Roy Thomas Fielding博士于2000年提出,现已广泛应用于各种桌面级web应用中。其核心思想是约定不同的ID来表示不同的资源或者后台服务,结合http协议,通常ID表示请求url,http请求方法包括post,get,put等。请求url的命名定义应能直观反应API的功能行为。请求url的命名和服务器端资源的访问路径无直接关系,具体映射关系由后端服务器的路由分发请求决定。

表1 前后端交互接口API

除下载接口,其余所有接口的返回均以Json格式数据返回。Json格式数据是当下桌面级web应用前后端交互的最主流格式,前端页面通过AJAX请求得到的Json格式数据可以转化成一个JS对象,从而可以完成与页面模板中的模板数据对应,实现当前页面数据的自动刷新。

3 后端设计

传统桌面级服务器领域的后端部署通常采用Apache、Nginx或者NodeJS,同时实现动态网页技术还需要PHP、JAVA、Python等至少一种语言的支持。然而大部分的车载嵌入式设备的操作系统都是按需裁剪的,仅保留自身业务功能需要的组件,以保证整个系统的轻量化,因此通常均不具有这些桌面级服务器领域的软件资源和环境。

嵌入式领域的web服务器有很多开源的实现方案,例如lighthttpd、boa等,但这些web服务器均不支持任意自定义的Restful API方式,要实现动态网页必须通过CGI技术,每个CGI均要对应一个服务器端的程序或者脚本,而且不够轻量,在跨平台移植方面的支持也不友好。

选择Mongoose[3]来构建后端的http服务。Mongoose是一个开源的网络通信服务库,流行度非常高。它的实现极其轻量,仅包含一个.c源文件和一个.h头文件,因此可快速的集成到用户的开发环境中来。因前端的tcp处理采用了异步事件poll方式,同时具有较好的性能,最重要的是它支持Restful API。通过封装它提供的API接口可以快速地创建http服务。用户只需定义和配置路由分发接口,并完成相应接口的回调实现。整个后端的处理流程如图4所示。后端主进程先进行Mongoose http服务器的初始化配置工作,然后初始化路由请求分发表,表中每一项对应一个请求url字符串和一个对应的处理函数,采用哈希表实现。然后启动对应端口监听的http服务,此时主进程会进入休眠等待状态,直到客户端浏览器发起了一个http请求,主进程会立即被唤醒,读取相应套接字上的数据流,然后进行http协议的解析,最终进入钩子函数,函数入口会传入一个http_message 结构的引用,内部的相关成员已经全部被解析和填充,可以获取对应的url字符串和get/post参数。

图4 后端处理流程

为了便于接口的维护和提高可扩展性,设计了路由分发层,在初始化的路由请求分发表中存储了所有的请求url和对应处理函数的键值关系,在ev_handler函数中将解析得到的url字符串进行哈希查找,然后调用对应的回调函数。每当需要增加一个新的接口,只需要在路由分发表中加入一项新接口的url字符串和对应的处理函数,然后补充对应处理函数的实现,完全不会影响既有的路由请求接口功能。结合表1列出的全部接口,只需在后端添加对应的路由分发表,然后给出具体的业务实现。

对于获取和设置业务进程的相关状态数据的接口功能实现,每当收到相关的路由请求,可以对相应的业务进程发起跨进程间通信,并制定相应的通信协议,进程间通信可采用文件socket、消息队列、或者管道等方式,让所有的业务进程提供相关状态信息的获取和设置接口,返回对应的数据。

对于固件上传功能的实现,HTTP_STREAMING_MULTIPART是标准的基于http的上传协议,Mongoose提供了处理HTTP_STREAMING_MULTIPART协议的API,只要在ev_handler函数内部判断请求类型为HTTP_STREAMING_MULTIPART,然后调用该协议的处理函数。Mongoose提供的上传处理函数只能处理单个文件的上传,而车载嵌入式系统的软件资源通常是一个集合,包括脚本、可执行程序、配置文件、动态链接库、web相关的静态资源等,最终以压缩包的形式提供,因此需要优化Mongoose提供的上传处理函数,在最终协议结束的状态入口加入对上传文件类型的判断,如果是固件压缩包则进行解压缩处理,再将解压得到的各种资源按照项目需求拷贝到对应的目录结构中。

4 结 论

针对车载嵌入式设备维护软件的设计需求,提出一种基于SPA前端技术和Mongoose服务器技术相结合的通用设计方案。通过响应式页面的前端设计可以实现非常美观和友好的人机界面,并且兼容各种平台的终端(包括PC端和手机移动端),从而无需为各种不同的终端编写不同的客户端软件,在节约开发成本的同时极大的提高了用户体验。由于整个方案前端采用组件化设计,后端采用模块化设计,因此,对于不同的项目只需针对不同的业务需求更改相应的前端组件展示和后端路由分发处理模块即可快速移植。该方案已在动车组辅助驾驶装置、动车组应急牵引装置等多个项目中部署实施,能够满足现场维护人员的功能需求,可作为车载嵌入式系统维护软件的通用设计方案加以推广应用。

猜你喜欢
视图路由嵌入式
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
铁路数据网路由汇聚引发的路由迭代问题研究
TS系列红外传感器在嵌入式控制系统中的应用
路由重分发时需要考虑的问题
嵌入式PLC的设计与研究
视图
嵌入式单片机在电机控制系统中的应用探讨
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
基于AODV 的物联网路由算法改进研究