system: [SYSTEM]

user: 4. 数据处理系统及管理端的开发 4.1. 整体架构 数据处理系统和管理端由硬件和软件两部分构成。硬件部分主要包括无线网络设备和服务器，软件部分则包括操作系统、编程语言和数据库。 考虑到数据处理系统需要同时处理平台与车载终端之间上下行的数据传输，且多终端的同时接入带来的高并发访问压力，仅通过软件层面的负载均衡会给开发带来较大的难度。为保证系统运行的稳定性以及后期扩展性，这里采用“一主多从”的服务器架构。在主服务器宕机时，可将任务切换到从服务器上进行处理，这种模式也将大大提高系统的可靠性 [ 8 ]。其物理架构如图3所示。 图3. 服务器物理架构 软件部分开发技术及相关工具如表1所示。 Table 1 Software development technology and tool 项目 采用技术或工具 软件流程设计工具 Microsoft Visio 软件开发工具 Sublime Text3/LiteIDE/CSS3 软件开发语言 PHP/Go/JavaScript 软件开发框架 Laravel 软件开发技术 HTML5 操作系统 Windows7/Linux 数据库 MySQL Web服务器 Apache 浏览器 Chrome 表1. 软件部分开发技术及工具 数据处理系统主要的功能以数据包解析、数据库管理为核心进行开发。因此，系统整体结构可分为数据解析和数据管理及调用两大主要板块。同时，数据解析部分是基础，是为数据管理及调用部分服务，整体系统的根本目的是实现对实时数据的管理及调用。远程监控平台系统主程序架构如图4。 图4. 远程监控平台主程序架构 4.2. 主程序设计开发 数据处理系统及管理端均采用基于PHP编程语言的Laravel框架进行开发。Laravel框架集成了极为丰富的预置组件，只需要聚焦于需要实现的功能并对其进行编写。对云平台及管理系统主要结构的开发流程如下： 1) 配置Laravel框架开发环境 为了开发的便捷性，采用WampServer作为开发的主要工具。WampServer集成了开发过程中关联的服务器及数据库工具，并自带一套PHP解释器，提供了完善的开发环境，省去了以传统方式配置PHP开发环境的复杂过程。完成WampServer软件的部署后，首先通过Composer工具箱，全局下载并安装Laravel开发框架，命令如下： $ composer global require laravel/installer=~1.1 安装完成后将c:/users/desktop/.composer/vendor/bin路径导入系统环境变量的路径中，框架可控制执行的文件能在控制台命令行中检索到，后期开发过程中仅需在控制台中直接运行命令即可。 2) 创建平台主程序 在Windows系统下的Powershell中打开控制台终端，进入预先为项目预留且具有完全权限的文件夹，执行laravel的应用创建命令，建立以项目名称为索引目录的新应用文件框架。本文将云平台命名为monitorcontrol，这里采用命令： $ composer create-project laravel/laravel monitorcontrol--prefer-dist 生成名为monitorcontrol的文件夹及Laravel主程序，生成后进入该文件夹： $ cd monitorcontrol 主程序运行于服务器端，主要处理云平台和管理系统部分的业务逻辑。monitorcontrol主程序文件夹中很多都是自动生成的与框架相关且能自由调用的预置文件，根据系统需求，主要对app文件夹中各文件代码进行编写。文件框架中各主要文件及文件夹作用总结如表2所示。 Table 2 The main function of each file and folder in the file framewor 文件或文件夹 作用 app 囊括项目中的controllers，models，views和assets，存放应用程序的业务逻辑代码。 bootstap 存放支持系统启动时的必备文件。 config 存放用于个性化定制框架功能的配置文件，包括运行规则、数据库、中间件等。 database 数据库操作相关的文件。 public 存放可供非开发人员查看的文件内容，包含服务器目录等。此文件夹还能存放css等静态资源。 resources 应用资源，包含视图文件、原生资源文件和本地化语言文件。 routes 包含建立的应用程序所有的路由。 storage 存放开发框架中支持功能运行的临时文件，且此目录在web上可以写入，由Laravel维护管理。 test 用来存放测试文件，便于进行单元测试。若要进行批量单元测试，可借助编译语言中内置的Artisan工具。 vender 存放第三方代码及额外的预包装功能插件，Composer依赖模块。 seed 存放关系型数据批量导入项目数据层表单的引导文件。 controllers 存放用于支持执行业务逻辑及完成处理模型、相关文件等加载功能的控制器。 auth.php 在程序中进行直接的身份验证操作。 session.php 控制Laravel管理诸如session driver，session lifetime等用户session。 表2. 文件框架各文件及文件夹主要作用 3) 开发API 数据处理系统及管理端需要预先配置数据操作的API接口。在laravel框架中编写接口文件比较方便，在主程序目录下的routes/api.php文件中编写路由即可，编写方式与网页路由相同。在路由编写完成后，在App/Http/Controller目录下建立api文件夹，存放所有的接口文件。管理端对API的控制具有最高权限，用户对数据操作的前提是通过管理端的授权并完成身份验证。 本文创建的接口均为RESTful API。RESTful API遵循统一的接口原则，使用HTTP动词表示操作：GET——获取资源；POST——创建资源；PUT——更新资源；DELETE——删除资源 [ 9 ]。RESTful的无状态性决定了只需要维护资源的状态，而不需要考虑客户端状态，这样类型的API简单精炼，还能有效实施负载均衡。RESTful API采用URI标识资源、使用“链接”关联相关的资源、运用统一的接口、使用标准的HTTP方法和无状态性的特点，是在本系统不同层级间构建标准交互接口的理想方案。 客户端在执行与当前功能相关的数据调用请求时，统一从预设的数据调用接口接入监控平台服务器，所有的数据交换均遵循通用标准，不存在运行于不同操作系统的客户端需要用不同的编程语言来实现数据交互的问题，以此大大简化了为实现监控数据在不同平台设备间调用的开发流程。 4.3. 云平台数据库设计 4.3.1. 数据库概念模型设计 对于数据处理系统及管理端而言，车辆监控数据库是整体系统的底层基础。而在数据库设计与开发的过程中，其概念模型的规划显得尤为重要，概念模型建立的本质是对数据库的存储结构进行设计。目前，大部分数据库设计均使用实体-关系模型，即E-R模型。E-R模型从结构上分析拥有实体、属性、关系三个成分，分别用长方形、椭圆形、菱形来表示。就本平台而言，系统管理员及管理系统各功能模块充当的是实体，模块下的各信息列表则为属性，关于数据处理系统的数据库概念模型可由图5表示。 图5. 远程监控平台数据库E-R图 4.3.2. 数据库信息列表设计 从数据库E-R图出发，并综合《GB/T 32960电动汽车远程服务与管理系统技术规范》的采集要求，为满足系统的监控功能须创建以下9个数据表：登入登出信息表(t_car_login_and_logout)；车辆数据表(t0x01)；驱动电机数据表(t0x02)；燃料电池数据表(t0x03)；车辆定位数据表(t0x05)；极值数据表(t0x06)；报警数据表(t0x07)；电池电压数据表(t0x08)；电池温度数据表(t0x09)。为便于开发过程中查阅及核对，将表单名称以与国标中类型编码匹配的t0x0_形式命名。由于篇幅限制，下面仅对登入登出信息及车辆数据表的内容、数据类型及结构进行设计，其余表单设计不再赘述。 1) 登入登出数据表(t_car_login_and_logout) 登入登出信息表存放车辆在远程监控平台上登入登出数据，其结构与包含信息如表3所示。 Table 3 Login and logout information for 序号 字段代号 字段含义 数据类型 1 VIN 车架号 char(17) 2 login_time 登入平台时间 timestamp 3 login_number 登入流水号 smallint(2) 4 ICCID SIM卡号 char(20) 5 energy_storage_sys_code 储能装置编号 text 6 logout_time 登出平台时间 timestamp 7 logout_number 登出流水号 smallint(2) 表3. 登入登出信息表 2) 车辆数据表(t0x01) 车辆数据表存放监控车辆的实时监控数据，包含车辆运行的各种信息，其结构与相关信息如表4所示。 Table 4 Vehicle data shee 序号 字段代号 字段含义 数据类型 1 report_at 上报时间 timestamp 2 status_vehicle 车辆状态 char(1) 3 status_charge 充电状态 char(1) 4 speed 车速 smallint(6) 5 mileage 累计里程 int(11) 6 voltage 总电压 smallint(6) 7 electricity 总电流 mediumint(6) 8 SOC SOC tinyint(4) 9 status_dcdc DC/DC状态 char(1) 10 gear 档位 char(1) 11 accelerator 加速踏板行程 smallint(6) 12 brake 制动踏板状态 smallint(6) 14 resistance 绝缘电阻 mediumint(9) 表4. 车辆数据表 至此，数据库的设计全部完成。 4.4. 实时数据报文解析入库模块开发 图6. 数据封装及解包流程 车载终端采集的车辆实时数据是以TCP/IP协议报文的形式，通过4G无线网络传输至数据处理系统的服务器端。因此，对于报文的解析处理同样是依赖TCP/IP协议。TCP/IP参考模型将协议分为四个层次，在实时数据传输的实际应用中，TCP/IP协议族会对采集的数据按照这四个层次的层级按照顺序进行包装，每一层的包装操作如下： 1) 应用层：应用程序按照TCP协议对采集的数据进行编码处理。 2) 传输层：参照TCP协议中的规定，将上一层传送下来的字节流分割为报文字段，并在数据前端封装TCP首部。 3) 网络层：参照IP协议，将上一层传送下来的封装数据前端加装IP首部，确认接收IP包的主机。 4) 链路层：将等待发送的封装数据加装以太网首部，并进行CRC编码，最终生成的以太网数据包通过物理层进行发送 [ 10 ]。 当实时数据完成上述四层封装后，将会传输到服务器的接收端口。由于其从上到下、按层包装的特点，接收端的解包流程则与发送端的包装流程互逆，数据处理及传输流程如图6所示。 至此，远程监控平台对实时数据的报文完成了初步解析，获得了完整的数据包。由于数据包是以数据帧的形式呈现在服务器端，属于不可读的信息，因此，在后台需要对数据帧进行二次解析，即对应GB/T 32960对数据包各字段的定义，将数据帧还原为可读的信息 [ 11 ]。将数据帧还原的操作流程设计依据为数据包的结构，数据包结构如表5所示。 Table 5 Data package structure and definitio 起始字节 定义 数据类型 描述 0 起始符 STRING 固定为ASCII字符‘# #’，用“0x23，0x23”标识。 2 命令单元 命令标识 BYTE 命令发起方的唯一标识。 3 应答标识 BYTE 令接收方识别此包类型。 4 唯一识别码 STRING 传输数据时使用的车辆VIN。 21 数据单元加密方式 BYTE 对RSA算法、AES128位算法等加密方式进行标识。 22 数据单元长度 WORD 数据单元总字节数。 24 数据单元 — 车辆相关的各类型数据编码。 末位 校验码 BYTE 采用BCC (异或校验)法。 表5. 数据包结构及定义 根据其结构特点，平台接收到数据包后应立即进行识别，国标规定起始符为“0x23，0x23”数据包为有效数据，不符合规定起始符的数据包不予解析，并向车载终端回复补发命令；接着进行数据帧异或校验，未通过校验的数据包存在通讯错误，视为无效数据并返回未通过校验信息；之后进行完整性校验，即对数据单元长度标识和实际数据单元长度进行比对，若匹配则进行解析的下一步流程，若不匹配则舍弃当前数据包并向车载终端回复补发命令；完成各识别和校验操作后，即可对数据信息进行还原及入库的操作；由于为保障信息传输的安全性对数据进行了加密，因此首先需要针对加密类型进行解密，获得可操作数据帧；定位命令单元，解析命令标识及应答标识，确认其为车载终端与远程监控平台间交互的何种命令；寻址至数据帧第24位，将信息单元编码对照GB/T 32960中对各类型数据编码的定义，转换为可读信息。车辆VIN作为数据帧的识别码，本质上代表了当前数据包的归属对象，与可读的数据信息整合后，形成具有对象信息的实时数据。最后将可读数据按照其类型编码，填充入前文设计的数据库数据表单中，交由数据库进行存储与管理。实时数据报文在服务器端的解析入库流程可由图7所示。 由于云平台接入的车载终端数量较多，加之各车载终端的实时数据上报频率较高，云平台服务器端亟需解决的是应对高并发实时数据的接收与处理。前文针对此问题，采用了“一主多从”的分布式服务器物理架构，软件部分的程序编写同样需要对此进行优化。在此，本文选用Go语言，针对高并发的实时数据解析入库部分进行程序的编写。 Go语言在并发编程方面的应用主要运用的是goroutine。goroutine是Go语言中处理并行任务的核心，其本质为比线程更小的协程。创建goroutine并不需要对原始代码进行复杂的调整，仅需在原始语句前增加“go”关键字，就可以创建并发执行单元。 报文解析入库部分的文件框架除主运行程序main.go外，其他各模块均存放于tool文件夹，方便主程序的调用。主程序负责设置CPU数量、开启日志服务、连接数据库及启用数据解析功能等方面工作。tool文件夹中包含dataParser、Logger、mysql、tcpServer和utils 5个主要模块。dataParser负责定义各数据的数据类型，并针对各类数据信息单元的不同结构对其解析规则进行制定；另外编写了对信息体数据解析流程，以及对查询指令的处理逻辑。Logger对日志服务进行管理。mysql负责数据库的连接及验证，利用go关键词建立goroutine，实现实时数据的并行入库操作；同时将车辆VIN与实时数据绑定，运用SQL语句将数据按其类型归属插入到数据表单中。tcpServer负责建立通讯连接，完成后开始接收上传数据。接着按照TCP/IP协议中各字段含义的映射规则，运用解析函数将报文中的字段转换为可读信息；同时负责对升级指令、控制指令等下行数据包的发送。utils为数据计算工具，负责标准时间的换算、单双字节计算、数值异常判断及时间生成等数值计算方法的调用。后台主程序启动后各模块协同工作，整体程序按照设计的数据解析逻辑完成解析入库的处理，并在应对高并发场景中具备较好的负载均衡能力。 图7. 数据解析入库流程