网络|基于Netty构建的高性能车辆网项目实现(一)

时间:2024-05-20 18:45:18

本文主要做技术分享,如有侵权请通知作者删除

项目背景
网络|基于Netty构建的高性能车辆网项目实现(一)

       该项目是d市的*项目,需要从n(n>10000)台公交车中收集车上数据,包括驱动、电池、发动机、报警等共计100余种车辆信息,需要基于国标32960协议完成数据的接收与应答,并基于海量的车上数据做大数据分析,报表展示,更需要车辆报警信息作应急处理,对实时性有很高的要求,基于此需要在车上安装车载终端(一种可以嵌入到车上的硬件设备,支持can协议读取数据,材料需要满足防火防水等要求),该车载终端我们暂且叫dbox(非真实名称)。



项目技术选型

       Netty,Kafka,Redis,SpringCloud,SpringBoot,MySQL,FastDFS,Docker,K8s,Jekin,Nacos,Hadoop,HBase,Spark等等一些系列技术(本文重点在Netty)


系统整体架构
网络|基于Netty构建的高性能车辆网项目实现(一)
       以上是整体系统架构图(图画的有点糙,博主是个粗人),整体的数据流向为:

  1. 车载终端通过平台登入与车辆登入(后面会详细解释该过程,读者暂时当做“黑盒”来理解)上报数据
  2. 车载终端上报数据由netty服务端接收并根据GB32960协议解码成POJO对象,并把解码对象放入kafka中
  3. 大数据平台通过kafka采集数据,做数据分析,统计,日志等处理(不是本文的重点)
  4. 数据检查模块需要检查解码数据是否有异常(协议中规定为异常,报警),把异常数据分析的结果再次放入到kafka,并把解码数据原封不动的放入到Redis中,供admin模块调用(4过程与3过程异步同时进行,互不影响)
  5. admin模块从kafka中获取到异常数据的分析结果,从Redis,Mysql数据库中获取数据,并做基本的添删该查等业务处理


协议简介

       GB32960协议是根据有关电动汽车远程服务而设计的协议,通过该协议可以从车上获取指定车辆的数据,他的数据格式是以16进制0x230x23开头的协议(注:该部分读者不感兴趣可以直接跳过,该协议理解需要花一定时间,限于篇幅,只简单介绍数据格式,不影响后面的代码阅读),具体数据格式如下图:

网络|基于Netty构建的高性能车辆网项目实现(一)       一些重要的数据格式解读:

  • 唯一识别码vin:车辆的vin识别码,由17个Byte字节组成,车辆的唯一标识
  • 数据单元长度:描述数据单元的长度,后续涉及的半包读(粘包粘包)解码方案与该项有关
  • 数据单元:这一包数据,包含各种数据来源,驱动电机,发动机,电池等种类数据


    技术难点

       在项目中需要解决的技术难点有很多,也涉及到一些技术解决方案,以下是该项目面临的部分难点

  • 如何解决车载终端接入增多问题,如何解决海量的设备接入与实时性的要求
  • 如何基于GB32960协议完成数据的粘包和粘包操作(半包读写问题)
  • 如何处理大数据包的拆分情况,数据的分包与合包如何处理
  • 如何更加高效的解码数据包,与应答车载终端
  • 后端服务如何高可用高性能
  • 数据检查过程中如何快速筛选异常数据,并解决高并发环境下的数据共享问题
  • 车载终端如何升级车载程序与获取终端配置

待续......