• 上游
  • 中游
  • 下游

车联网项目

  • 车联网项目分析的目的

车联网数据分析车辆驾驶信息、车辆行驶信息、车辆车况信息、车辆故障信息、车辆报警信息等。

  • 车联网项目分析的意义
  1. 对车企

车辆流程改进、车辆产品质量改进做决策
2. 对车主

提供告警和报警信息,预防预测,防止出现危险、事故等
3. 对监管部门

监管车辆的行驶轨迹、防止骗补,故障告警等
4. 新能源充电桩企业

电量的电价,规划和放置充电桩位置

  • 星途车联网项目

通过终端设备采集车辆上的CAN总线实时数据和企业静态hu离线数据,获取当前车辆的位置、行驶高程、车速、油压、电量、行驶里程、告警数据等数据,对其进行业务,车辆行程、故障告警、电子栅栏、百公里油耗、高温报警、低soc告警、疲劳驾驶告警等车联网分析,支撑汽车后服务市场、车企、政府监管部门、车主等服务。

海量存储

海量计算

  • 数据量
原始数据  1kb/报文
5秒上报一条数据,12kb/1分钟 =》 720kb/h  => 7200kb/day => 7200 0000kb/1w/day  => 7200 0000 * 4/day =>  7200 0000 * 4 * 3/day = 823GB/day 存储 / 0.7 * 90 = 103 TB/三个月

物理机   8T  128GB  5w*13=65w
云计算 阿里云  
         同等配置   5w/year

车联网技术架构和技术选型

  • 车联网项目
  • 大数据相关组件

Flink 流处理

kafka 消息队列

HDFS 分布式存储系统

HBase 大表存储

Phoenix 基于SQL的查询

MySQL/mongodb 存储结果数据

Zeppelin 前端SQL图表化

Dolphinscheduler 调度平台

  • 任务调度方式
#!/bin/sh
spark-submit --class com.dfssi.dataplatform.analysis.fuel.stats.ConditionFuelStatisticians  
--master yarn 
--deploy-mode client 
--num-executors 2 
--driver-memory 1g 
--executor-memory 3g 
--executor-cores 2 
--jars $(echo ../target/jars/\*.jar | tr ' ' ',') 
../target/DataMiningAnalysis-0.1-SNAPSHOT.jar

在调度平台中加载 shell 文件

车联网项目的架构搭建

  • 车联网项目框架搭建
  • 创建 CarNetworkingSystem 项目框架
  • 导入依赖 jar 包的版本
  • 导入配置文件 conf.properties logback.xml
  • 创建各个模块

group

artifact

模块

packaging

生成方式

cn.maynor

CarNetworkingSystem

父工程

pom

创建

cn.maynor

StreamingAnalysis

实时流式模块

jar

创建

cn.maynor

OffLineBatchAnalysis

离线批处理模块

jar

创建

cn.maynor

SourceDataProcess

数据生成模拟器模块

jar

创建

cn.maynor

VehicleNetworkWeb

Web可视化模块

war

导入

  • 实时ETL处理,对 json字符串解析
  • json字符串
"{\"batteryAlarm\": 0, \"carMode\": 1,\"minVoltageBattery\": 3.89, \"chargeStatus\": 1,\"vin\":\"LS5A3CJC0JF890971\"}"
  • 复杂的 key/value 和 list集合的 json字符串解析示例
package cn.maynor.flink.source.test;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

/\*\*
 \* Author maynor
 \* Date 2021/9/19 17:41
 \* 将json字符串转换成对象,将key-value转换成 HashMap
 \* 对json字符串进行封装
 \* 开发步骤:
 \* 1.定义 json 字符串
 \* 2.将JSONObject 字符串转换成 HashMap
 \* 3.将JSONObject转换成 List<HashMap<String,Object>>
 \* 4.解析 json 字符串
 \* 5.转换成对象
 \* 6.打印输出结果
 \*/
public class JsonPlusParseOptimize {
    public static void main(String[] args) {
        //1.定义 json 字符串
        String json = "{\"batteryAlarm\": 0,\"carMode\": 1,\"minVoltageBattery\": 3.89,\"chargeStatus\": 1,\"vin\": \"LS5A3CJC0JF890971\",\"nevChargeSystemTemperatureDtoList\": [{\"probeTemperatures\": [25, 23, 24, 21, 24, 21, 23, 21, 23, 21, 24, 21, 24, 21, 25, 21],\"chargeTemperatureProbeNum\": 16,\"childSystemNum\": 1}]}";
        //2.将JSONObject 字符串转换成 HashMap
        JSONObject jsonObject = new JSONObject(json);
        HashMap<String,Object> vehicleHashMap = toHashMap(jsonObject);
        //3.将JSONObject转换成 List<HashMap<String,Object>>
        //读取key,将字符串传递进来
        String nevChargeSystemTemperatureDtoStr = vehicleHashMap.get("nevChargeSystemTemperatureDtoList").toString();
        List<HashMap<String,Object>> lists = toList(nevChargeSystemTemperatureDtoStr);
        //4.解析 json 字符串
        //5.转换成对象
        System.out.println(Integer.parseInt(vehicleHashMap.getOrDefault("batteryAlarm",-999999).toString()));
        //6.打印输出结果
        for (HashMap<String, Object> list : lists) {
            System.out.println(list.getOrDefault("chargeTemperatureProbeNum",-999999).toString());
        }
    }

    /\*\*
 \* 将json数组字符串转换成List<HashMap>
 \* @param value
 \* @return
 \*/
    private static List<HashMap<String, Object>> toList(String value) {
        List<HashMap<String, Object>> lists = new ArrayList<>();
        JSONArray objects = new JSONArray(value);
        //遍历数组,取出所有的对象并转换成 HashMap
        for (Object object : objects) {
            String jsonStr = object.toString();
            JSONObject jsonObject = new JSONObject(jsonStr);
            lists.add(toHashMap(jsonObject));
        }
        return lists;
    }

    /\*\*
 \* 将 JSONObject 转换成 HashMap 对象
 \* @param jsonObject
 \* @return
 \*/
    private static HashMap<String, Object> toHashMap(JSONObject jsonObject) {
        HashMap<String, Object> kv = new HashMap<String,Object>();
        //读取 jsonObject 所有 keys
        Set<String> keys = jsonObject.keySet();
        for (String key : keys) {
            //遍历所有key,得到所有值
            kv.put(key,jsonObject.get(key));