解析系统

master
ZhangXushuo 2023-12-01 15:27:49 +08:00
parent d90f17dad4
commit 25c4aae722
16 changed files with 718 additions and 5 deletions

View File

@ -1,7 +1,6 @@
# Tomcat
server:
port: 8080
# Spring
spring:
application:

View File

@ -0,0 +1,37 @@
package com.fivegroup.analysis.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 19:25
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Topic {
/**
* id
*/
private long id;
/**
* VIN
*/
private String vehicleVin;
/**
*
*/
private String topic;
/**
*
*/
private Integer subzone;
}

View File

@ -0,0 +1,300 @@
package com.fivegroup.analysis.domain;
import lombok.*;
import java.math.BigDecimal;
import java.util.Date;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 20:28
*/
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class VehicleData {
/**
* VIN
*/
private String vin;
/**
*
*/
private Date createTime;
/**
*
*/
private String longitude;
/**
*
*/
private String latitude;
/**
*
*/
private String speed;
/**
*
*/
private BigDecimal mileage;
/**
*
*/
private String voltage;
/**
*
*/
private String current;
/**
*
*/
private String resistance;
/**
*
*/
private String gear;
/**
*
*/
private String accelerationPedal;
/**
*
*/
private String brakePedal;
/**
*
*/
private String fuelConsumptionRate;
/**
*
*/
private String motorControllerTemperature;
/**
*
*/
private String motorSpeed;
/**
*
*/
private String motorTorque;
/**
*
*/
private String motorTemperature;
/**
*
*/
private String motorVoltage;
/**
*
*/
private String motorCurrent;
/**
* SOC
*/
private BigDecimal remainingBattery;
/**
*
*/
private String maximumFeedbackPower;
/**
*
*/
private String maximumDischargePower;
/**
* BMS
*/
private String selfCheckCounter;
/**
*
*/
private String totalBatteryCurrent;
/**
* V3
*/
private String totalBatteryVoltage;
/**
*
*/
private String singleBatteryMaxVoltage;
/**
*
*/
private String singleBatteryMinVoltage;
/**
*
*/
private String singleBatteryMaxTemperature;
/**
*
*/
private String singleBatteryMinTemperature;
/**
*
*/
private String availableBatteryCapacity;
/**
*
*/
private int vehicleStatus;
/**
*
*/
private int chargingStatus;
/**
*
*/
private int operatingStatus;
/**
* SOC
*/
private int socStatus;
/**
*
*/
private int chargingEnergyStorageStatus;
/**
*
*/
private int driveMotorStatus;
/**
*
*/
private int positionStatus;
/**
* EAS()
*/
private int easStatus;
/**
* PTC()
*/
private int ptcStatus;
/**
* EPS()
*/
private int epsStatus;
/**
* ABS()
*/
private int absStatus;
/**
* MCU(/)
*/
private int mcuStatus;
/**
*
*/
private int heatingStatus;
/**
*
*/
private int batteryStatus;
/**
*
*/
private int batteryInsulationStatus;
public static VehicleData getBuild(String messages) {
char start = messages.charAt(0);
char end = messages.charAt(messages.length() - 1);
System.out.println(start);
System.out.println(end);
return VehicleData.builder()
.vin(messages.substring(1, 18))
.createTime(new Date(Long.parseLong(messages.substring(18, 31))))
.longitude(messages.substring(31, 42))
.latitude(messages.substring(42, 52))
.speed(messages.substring(52, 58))
.mileage(new BigDecimal(messages.substring(58, 69)))
.voltage(messages.substring(69, 75))
.current(messages.substring(75, 80))
.resistance(messages.substring(80, 89))
.gear(messages.substring(89, 90))
.accelerationPedal(messages.substring(90, 92))
.brakePedal(messages.substring(92, 94))
.fuelConsumptionRate(messages.substring(94, 99))
.motorControllerTemperature(messages.substring(99, 105))
.motorSpeed(messages.substring(105, 110))
.motorTorque(messages.substring(110, 114))
.motorTemperature(messages.substring(114, 120))
.motorVoltage(messages.substring(120, 125))
.motorCurrent(messages.substring(125, 133))
.remainingBattery(new BigDecimal(messages.substring(133, 139)))
.maximumFeedbackPower(messages.substring(139, 145))
.maximumDischargePower(messages.substring(145, 151))
.selfCheckCounter(messages.substring(151, 153))
.totalBatteryCurrent(messages.substring(153, 158))
.totalBatteryVoltage(messages.substring(158, 164))
.singleBatteryMaxVoltage(messages.substring(164, 168))
.singleBatteryMinVoltage(messages.substring(168, 172))
.singleBatteryMaxTemperature(messages.substring(172, 178))
.singleBatteryMinTemperature(messages.substring(178, 184))
.availableBatteryCapacity(messages.substring(184, 190))
.vehicleStatus(Integer.valueOf(messages.substring(190, 191)))
.chargingStatus(Integer.valueOf(messages.substring(191, 192)))
.operatingStatus(Integer.valueOf(messages.substring(192, 193)))
.socStatus(Integer.valueOf(messages.substring(193, 194)))
.chargingEnergyStorageStatus(Integer.valueOf(messages.substring(194, 195)))
.driveMotorStatus(Integer.valueOf(messages.substring(195, 196)))
.positionStatus(Integer.valueOf(messages.substring(196, 197)))
.easStatus(Integer.valueOf(messages.substring(197, 198)))
.ptcStatus(Integer.valueOf(messages.substring(198, 199)))
.epsStatus(Integer.valueOf(messages.substring(199, 200)))
.absStatus(Integer.valueOf(messages.substring(200, 201)))
.mcuStatus(Integer.valueOf(messages.substring(201, 202)))
.heatingStatus(Integer.valueOf(messages.substring(202, 203)))
.batteryStatus(Integer.valueOf(messages.substring(203, 204)))
.batteryInsulationStatus(Integer.valueOf(messages.substring(204, 205)))
.build();
}
}

View File

@ -0,0 +1,16 @@
package com.fivegroup.analysis.domain.constant;
/**
* kafka
*
* @author ZhangXushuo
* @version 2023/11/30 - 19:26
*/
public class KafkaConstant {
public static final String KAFKA_BOOTSTRAP_SERVERS = "101.34.69.116:9092";
/**
* kafka
*/
public static final String KAFKA_TOPIC = "fiveGroup";
}

View File

@ -0,0 +1,15 @@
package com.fivegroup.analysis.mapper;
import com.fivegroup.analysis.domain.VehicleData;
import org.apache.ibatis.annotations.Mapper;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 22:36
*/
@Mapper
public interface VehicleHistoryIncidentMapper {
void vehicleInsert(VehicleData vehicleDate);
}

View File

@ -0,0 +1,36 @@
package com.fivegroup.analysis.service;
import com.fivegroup.analysis.domain.constant.KafkaConstant;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import java.util.Properties;
/**
*
*
* @author ZhangXushuo
* @version 2023/12/1 - 11:13
*/
@Service
@Log4j2
public class KafkaConsumerConfig {
@Bean
public Consumer<String,String> consumerInit(){
log.info("kafka消费者初始化开始");
long startTime = System.currentTimeMillis();
Properties props = new Properties();
props.put("bootstrap.servers", KafkaConstant.KAFKA_BOOTSTRAP_SERVERS);
props.put("group.id", "group01");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
log.info("kafka消费者初始化结束 耗时:[{}MS]", System.currentTimeMillis() - startTime);
return new KafkaConsumer<>(props);
}
}

View File

@ -0,0 +1,119 @@
package com.fivegroup.analysis.service;
import com.alibaba.fastjson.JSONObject;
import com.fivegroup.analysis.domain.Topic;
import com.fivegroup.analysis.domain.VehicleData;
import com.fivegroup.common.core.utils.SpringUtils;
import com.fivegroup.common.redis.service.RedisService;
import com.rabbitmq.client.Channel;
import lombok.extern.log4j.Log4j2;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.common.TopicPartition;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.Duration;
import java.util.*;
/**
*
*
* @author ZhangXushuo
* @version 2023/12/1 - 11:24
*/
@Service
@Log4j2
public class KafkaConsumerService {
@Autowired
private Consumer<String, String> consumer;
@Autowired
private RedisService redisService;
public static final String KAFKA_NAME = "test";
public static final String REDIS_NAME = "mq_message";
@RabbitListener(queuesToDeclare = {@Queue(name = "test")})
public void add(String parameter, Message message, Channel channel) {
log.info("开始消费了消费");
String messageId = message.getMessageProperties().getMessageId();
try {
log.info("UUID为{}", messageId);
Long add = redisService.redisTemplate.opsForSet().add(REDIS_NAME, messageId);
log.info("add为" + add);
if (1 == add && null != add) {
log.info("已开始消费");
Topic topic = JSONObject.parseObject(parameter, Topic.class);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
TopicPartition topicPartition = new TopicPartition(topic.getTopic(), topic.getSubzone());
// 订阅特定分区
consumer.assign(Collections.singleton(topicPartition));
new Thread(() -> {
while (true) {
ConsumerRecords<String, String> records = null;
try {
records = consumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> record : records) {
String value = record.value();
String messages = KafkaConsumerService.sixteenToStr(value);
VehicleData build = VehicleData.getBuild(messages);
if (redisService.hasKey(build.getVin())) {
System.out.println(build.getVin());
List<String> range = redisService.redisTemplate.opsForList().range(build.getVin(), 0, -1);
if (range.size() > 0) {
range.forEach(l -> {
System.out.println(l);
VehicleIncidentService vehicleIncidentService = SpringUtils.getBean(l);
vehicleIncidentService.execute(build);
});
}
}
}
} catch (Exception e) {
log.info("records {}", records);
log.error(e);
}
}
}).start();
}
} catch (Exception e) {
try {
//删除redis添加的数据
redisService.redisTemplate.opsForSet().remove(REDIS_NAME, messageId);
//退回
channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
log.info("异常数据已回退");
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
public static String sixToStrteen(String s) {
StringBuilder builder1 = new StringBuilder();
int length = s.length();
for (int i = 0; i < length; i++) {
int c = s.charAt(i);
String s1 = Integer.toHexString(c);
builder1.append(s1 + " ");
}
return builder1.toString();
}
public static String sixteenToStr(String s) {
StringBuilder builder1 = new StringBuilder();
String[] arr = s.split(" ");
int length = arr.length;
for (int i = 0; i < length; i++) {
int integer = Integer.parseInt(arr[i], 16);
builder1.append((char) integer);
}
return builder1.toString();
}
}

View File

@ -0,0 +1,14 @@
package com.fivegroup.analysis.service;
import com.fivegroup.analysis.domain.VehicleData;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 20:58
*/
public interface VehicleIncidentService {
void execute(VehicleData vehicleDate);
}

View File

@ -0,0 +1,30 @@
package com.fivegroup.analysis.service.impl;
import com.fivegroup.common.redis.service.RedisService;
import com.fivegroup.analysis.domain.VehicleData;
import com.fivegroup.analysis.service.VehicleIncidentService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 22:04
*/
@Log4j2
@Service("breakdown")
@AllArgsConstructor
public class VehicleBreakdownIncidentServiceImpl implements VehicleIncidentService {
private final RedisService redisService;
/**
*
* @param vehicleDate
*/
@Override
public void execute(VehicleData vehicleDate) {
log.info("vehicleDate: [{}]车辆故障触发事件" , vehicleDate.getVin());
}
}

View File

@ -0,0 +1,31 @@
package com.fivegroup.analysis.service.impl;
import com.fivegroup.analysis.domain.VehicleData;
import com.fivegroup.analysis.service.VehicleIncidentService;
import com.fivegroup.common.redis.service.RedisService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 22:25
*/
@Log4j2
@Service("fence")
@AllArgsConstructor
public class VehicleFenceIncidentServiceImpl implements VehicleIncidentService {
private final RedisService redisService;
/**
*
* @param vehicleDate
*/
@Override
public void execute(VehicleData vehicleDate) {
log.info("车辆电子围栏事件",vehicleDate.getVin());
}
}

View File

@ -0,0 +1,29 @@
package com.fivegroup.analysis.service.impl;
import com.fivegroup.analysis.domain.VehicleData;
import com.fivegroup.common.redis.service.RedisService;
import com.fivegroup.analysis.service.VehicleIncidentService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 22:28
*/
@AllArgsConstructor
@Log4j2
@Service("history")
public class VehicleHistoryIncidentServiceImpl implements VehicleIncidentService {
private final RedisService redisService;
/**
*
* @param vehicleDate
*/
@Override
public void execute(VehicleData vehicleDate) {
log.info("车辆的历史轨迹+[{}]",vehicleDate.getVin());
}
}

View File

@ -0,0 +1,32 @@
package com.fivegroup.analysis.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.fivegroup.common.redis.service.RedisService;
import com.fivegroup.analysis.domain.VehicleData;
import com.fivegroup.analysis.service.VehicleIncidentService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
/**
*
*
* @author ZhangXushuo
* @version 2023/11/30 - 22:32
*/
@Service("incident")
@Log4j2
@AllArgsConstructor
public class VehicleRealIncidentServiceImpl implements VehicleIncidentService {
private final RedisService redisService;
private static final String MD5_KEY = "MD5_KEY";
@Override
public void execute(VehicleData vehicleDate) {
Long along = redisService.redisTemplate.opsForList().leftPush(vehicleDate.getVin() + ""+ MD5_KEY, JSONObject.toJSONString(vehicleDate));
if(along>0){
log.info("车辆实时数据",vehicleDate.getVin());
}
}
}

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.fivegroup.analysis.mapper.VehicleHistoryIncidentMapper">
<select id="vehicleInsert">
INSERT INTO t_vehicle`
(`vin`, `create_time`, `longitude`, `latitude`, `speed`, `mileage`, `voltage`, `current`, `resistance`, `gear`, `acceleration_pedal`, `brake_pedal`, `fuel_consumption_rate`, `motor_controller_temperature`, `motor_speed`, `motor_torque`, `motor_temperature`, `motor_voltage`, `motor_current`, `remaining_battery`, `maximum_feedback_power`, `maximum_discharge_power`, `self_check_counter`, `total_battery_current`, `total_battery_voltage`, `single_battery_max_voltage`, `single_battery_min_voltage`, `single_battery_max_temperature`, `single_battery_min_temperature`, `available_battery_capacity`, `vehicle_status`, `charging_status`, `operating_status`, `soc_status`, `charging_energy_storage_status`, `drive_motor_status`, `position_status`, `eas_status`, `ptc_status`, `eps_status`, `abs_status`, `mcu_status`, `heating_status`, `battery_status`, `battery_insulation_status`)
VALUES
(
#{vin},
#{createTime},
#{longitude},
#{latitude},
#{speed},
#{mileage},
#{voltage},
#{current},
#{resistance},
#{gear},
#{accelerationPedal},
#{brakePedal},
#{fuelConsumptionRate},
#{motorControllerTemperature},
#{motorSpeed},
#{motorTorque},
#{motorTemperature},
#{motorVoltage},
#{motorCurrent},
#{remainingBattery},
#{maximumFeedbackPower},
#{maximumDischargePower},
#{selfCheckCounter},
#{totalBatteryCurrent},
#{totalBatteryVoltage},
#{singleBatteryMaxVoltage},
#{singleBatteryMinVoltage},
#{singleBatteryMaxTemperature},
#{singleBatteryMinTemperature},
#{availableBatteryCapacity},
#{vehicleStatus},
#{chargingStatus},
#{operatingStatus},
#{socStatus},
#{chargingEnergyStorageStatus},
#{driveMotorStatus},
#{positionStatus},
#{easStatus},
#{ptcStatus},
#{epsStatus},
#{absStatus},
#{mcuStatus},
#{heatingStatus},
#{batteryStatus},
#{batteryInsulationStatus}
)
</select>
</mapper>

View File

@ -1,6 +1,6 @@
# Tomcat
server:
port: 9210
port: 9211
# Spring
spring:

View File

@ -88,9 +88,6 @@
</dependency>
</dependencies>
<build>

View File

@ -18,6 +18,7 @@
<module>fivegroup-fault</module>
<module>fivegroup-wall</module>
<module>fivegroup-trajectory</module>
<module>fivegroup-analysis</module>
</modules>
<artifactId>fivegroup-modules</artifactId>