From 64823b766e0ce8c6e86c8ba619b35d8366435936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=A4=A7=E4=B8=BE?= <13970129+huandgaju@user.noreply.gitee.com> Date: Tue, 2 Apr 2024 23:08:57 +0800 Subject: [PATCH] =?UTF-8?q?kafka=E5=AE=9E=E7=8E=B0=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=EF=BC=8C=E7=9B=B4=E6=8E=A5=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E6=88=90=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- muyu-analyze/pom.xml | 123 +++++++ .../muyu/analyze/MuYuAnalyzeApplication.java | 36 ++ .../com/muyu/analyze/config/KafkaConfig.java | 48 +++ .../com/muyu/analyze/consumer/Consumer.java | 34 ++ .../com/muyu/analyze/domian/VehicleData.java | 281 ++++++++++++++++ .../com/muyu/analyze/utils/AnalyzeUtils.java | 318 ++++++++++++++++++ muyu-analyze/src/main/resources/bootstrap.yml | 36 ++ pom.xml | 14 +- 8 files changed, 885 insertions(+), 5 deletions(-) create mode 100644 muyu-analyze/pom.xml create mode 100644 muyu-analyze/src/main/java/com/muyu/analyze/MuYuAnalyzeApplication.java create mode 100644 muyu-analyze/src/main/java/com/muyu/analyze/config/KafkaConfig.java create mode 100644 muyu-analyze/src/main/java/com/muyu/analyze/consumer/Consumer.java create mode 100644 muyu-analyze/src/main/java/com/muyu/analyze/domian/VehicleData.java create mode 100644 muyu-analyze/src/main/java/com/muyu/analyze/utils/AnalyzeUtils.java create mode 100644 muyu-analyze/src/main/resources/bootstrap.yml diff --git a/muyu-analyze/pom.xml b/muyu-analyze/pom.xml new file mode 100644 index 0000000..721b504 --- /dev/null +++ b/muyu-analyze/pom.xml @@ -0,0 +1,123 @@ + + + 4.0.0 + + com.muyu + muyu + 3.6.3 + + + muyu-analyze + + + 20 + 20 + UTF-8 + + + + com.muyu + muyu-common-core + + + org.apache.kafka + kafka-clients + 2.8.0 + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + + + com.mysql + mysql-connector-j + + + + + com.muyu + muyu-common-datasource + + + + + com.muyu + muyu-common-datascope + + + + + com.muyu + muyu-common-log + + + + + com.muyu + muyu-common-swagger + + + com.muyu + muyu-file-remote + + + org.springframework.kafka + spring-kafka + 2.8.1 + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + diff --git a/muyu-analyze/src/main/java/com/muyu/analyze/MuYuAnalyzeApplication.java b/muyu-analyze/src/main/java/com/muyu/analyze/MuYuAnalyzeApplication.java new file mode 100644 index 0000000..c33adc9 --- /dev/null +++ b/muyu-analyze/src/main/java/com/muyu/analyze/MuYuAnalyzeApplication.java @@ -0,0 +1,36 @@ +package com.muyu.analyze; + +import com.muyu.common.security.annotation.EnableCustomConfig; +import com.muyu.common.security.annotation.EnableRyFeignClients; +import com.muyu.common.swagger.annotation.EnableCustomSwagger2; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 系统模块 + * + * @author muyu + */ +@EnableCustomConfig +@EnableCustomSwagger2 +@EnableRyFeignClients +@SpringBootApplication +@EnableScheduling +public class MuYuAnalyzeApplication +{ + public static void main(String[] args) + { + SpringApplication.run(MuYuAnalyzeApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ 系统模块启动成功 ლ(´ڡ`ლ)゙ \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/muyu-analyze/src/main/java/com/muyu/analyze/config/KafkaConfig.java b/muyu-analyze/src/main/java/com/muyu/analyze/config/KafkaConfig.java new file mode 100644 index 0000000..f8a2102 --- /dev/null +++ b/muyu-analyze/src/main/java/com/muyu/analyze/config/KafkaConfig.java @@ -0,0 +1,48 @@ +package com.muyu.analyze.config; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +import java.util.Properties; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +@Configuration +public class KafkaConfig { + + // Kafka Bootstrap Servers + public static final String BOOTSTRAP_SERVERS = "10.10.26.5:9092"; + + // 默认主题 + public static final String DEFAULT_TOPIC = "test"; + + public static final String DEFAULT_KEY = "10001"; + + + public static Properties properties1(){ + // 1;构建 Properties 对象 存放 kafka 生产者配置信息 + Properties properties1 = new Properties(); + // 设置 kafka 连接地址(从配置文件/环境变量获取) + properties1.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KafkaConfig.BOOTSTRAP_SERVERS); + // 设置 键值 序列化 + properties1.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer .class.getName()); + properties1.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + + return properties1; + } + + + public static Properties properties2(){ + Properties properties2 = new Properties(); + properties2.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.10.26.5:9092"); + properties2.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + properties2.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + properties2.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "group"); + + return properties2; + } + +} diff --git a/muyu-analyze/src/main/java/com/muyu/analyze/consumer/Consumer.java b/muyu-analyze/src/main/java/com/muyu/analyze/consumer/Consumer.java new file mode 100644 index 0000000..0f4fad8 --- /dev/null +++ b/muyu-analyze/src/main/java/com/muyu/analyze/consumer/Consumer.java @@ -0,0 +1,34 @@ +package com.muyu.analyze.consumer; + +import com.muyu.analyze.domian.VehicleData; +import com.muyu.analyze.utils.AnalyzeUtils; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 类说明 + * + * @author zhuwenqiang + * @date 2023/3/1 + */ +@Component +public class Consumer { + @KafkaListener(topics="test", groupId = "group",properties = {"bootstrap.servers=10.10.26.5:9092"}) + public void getMessage(String message) { + + VehicleData analyze = AnalyzeUtils.analyze(message); + + + System.out.println("kafka 消费者监听,接收到消息:" + analyze); + } + + + +} + + + diff --git a/muyu-analyze/src/main/java/com/muyu/analyze/domian/VehicleData.java b/muyu-analyze/src/main/java/com/muyu/analyze/domian/VehicleData.java new file mode 100644 index 0000000..c40181c --- /dev/null +++ b/muyu-analyze/src/main/java/com/muyu/analyze/domian/VehicleData.java @@ -0,0 +1,281 @@ +package com.muyu.analyze.domian; + + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + + +/** + * @author 牧鱼 + * @Classname VehicleData + * @Description 车辆模拟数据对象 + * @Date 2021/8/5 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class VehicleData { + /** + * VIN + */ + private String vin; + /** + * 毫秒值 + */ + private String dateTime; + + /** + * 行驶路线 + */ + private String drivingRoute; + + /** + * 经度 + */ + private String longitude; + + /** + * 维度 + */ + private String latitude; + + /** + * 速度 + */ + private String speed; + + /** + * 里程 + */ + private BigDecimal mileage; + + /** + * 总电压 + */ + private String voltage; + + /** + * 总电流 + */ + private String current; + + /** + * 绝缘电阻 + */ + private String resistance; + + /** + * 档位 + */ + private String gear = "P"; + + /** + * 加速踏板行程值 + */ + 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 BigDecimal batteryLevel; + + /** + * 当前状态允许的最大反馈功率 + */ + 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 = 1; + + /** + * 充电状态 + */ + private int chargingStatus = 1; + + /** + * 运行状态 + */ + private int operatingStatus = 1; + + /** + * SOC + */ + private int socStatus = 1; + + /** + * 可充电储能装置工作状态 + */ + private int chargingEnergyStorageStatus = 1; + + /** + * 驱动电机状态 + */ + private int driveMotorStatus = 1; + + /** + * 定位是否有效 + */ + private int positionStatus = 1; + + /** + * EAS(汽车防盗系统)状态 + */ + private int easStatus = 1; + + /** + * PTC(电动加热器)状态 + */ + private int ptcStatus = 0; + + /** + * EPS(电动助力系统)状态 + */ + private int epsStatus = 1; + + /** + * ABS(防抱死)状态 + */ + private int absStatus = 1; + + /** + * MCU(电机/逆变器)状态 + */ + private int mcuStatus = 1; + + /** + * 动力电池加热状态 + */ + private int heatingStatus = 1; + + /** + * 动力电池当前状态 + */ + private int batteryStatus = 1; + + /** + * 动力电池保温状态 + */ + private int batteryInsulationStatus = 1; + + /** + * DCDC(电力交换系统)状态 + */ + private int dcdcStatus = 1; + + /** + * CHG(充电机)状态 + */ + private int chgStatus = 1; + + /** + * 车辆状态 报文 + */ + private String vehicleStatusMsg; + /** + * 智能硬件 报文 + */ + private String smartHardwareMsg; + /** + * 电池报文 + */ + private String batteryMsg; + +} diff --git a/muyu-analyze/src/main/java/com/muyu/analyze/utils/AnalyzeUtils.java b/muyu-analyze/src/main/java/com/muyu/analyze/utils/AnalyzeUtils.java new file mode 100644 index 0000000..e0a9102 --- /dev/null +++ b/muyu-analyze/src/main/java/com/muyu/analyze/utils/AnalyzeUtils.java @@ -0,0 +1,318 @@ +package com.muyu.analyze.utils; + +import com.muyu.analyze.domian.VehicleData; + +import java.math.BigDecimal; +import java.util.Stack; + +/** + * @ProjectName: cloud-vehicles + * @PackageName: com.muyu.analyze.config + * @Description TODO + * @Author HuangDaJu + * @Date 2024/4/2 21:33 + * @Version 1.0 + */ + +public class AnalyzeUtils { + + public static VehicleData analyze(String aa) { + + VehicleData vehicleData = new VehicleData(); + /** + * 车辆VIN private String vin; + */ + String vin = aa.substring(0, 17); + vehicleData.setVin(vin); + + /** + * 毫秒值 private String dateTime; + */ + String time = aa.substring(17, 30); + vehicleData.setDateTime(time); + + /** + * 行驶路线 private String drivingRoute; + */ + + /** + * 经度 private String longitude; + */ + + String longitude = aa.substring(30, 41); + vehicleData.setLongitude(longitude); + + /** + * 纬度 private String latitude; + */ + + String latitude = aa.substring(41, 51); + vehicleData.setLatitude(latitude); + + /** + * 速度 private String speed; + */ + + String speed = aa.substring(51, 57); + vehicleData.setSpeed(speed); + + /** + * 里程 private BigDecimal mileage; + */ + + String mileage = aa.substring(57, 68); + vehicleData.setMileage(new BigDecimal(mileage)); + + /** + * 总电压 private String voltage; + */ + + String voltage = aa.substring(68, 74); + vehicleData.setVoltage(voltage); + + /** + * 总电流 private String current; + */ + + String current = aa.substring(74, 79); + vehicleData.setCurrent(current); + + + /** + * 绝缘电阻 private String resistance; + */ + String resistance = aa.substring(79, 88); + vehicleData.setResistance(resistance); + + /** + * 档位 private String gear = "P"; + */ + + String gear = aa.substring(88, 89); + vehicleData.setGear(gear); + + + /** + * 加速踏板行程值 private String accelerationPedal; + */ + + String accelerationPedal = aa.substring(89, 91); + vehicleData.setAccelerationPedal(accelerationPedal); + + + /** + * 制动踏板行程值 private String brakePedal; + */ + + String brakePedal =aa.substring(91,93); + vehicleData.setBrakePedal(brakePedal); + + /** + * 燃料消耗率 private String fuelConsumptionRate; + */ + + String fuelConsumptionRate =aa.substring(93,98); + vehicleData.setFuelConsumptionRate(fuelConsumptionRate); + + /** + * 电机控制器温度private String motorControllerTemperature; + */ + + String motorControllerTemperature =aa.substring(98,104); + vehicleData.setMotorControllerTemperature(motorControllerTemperature); + + + + /** + * 电机转速 private String motorSpeed; + */ + + String motorSpeed =aa.substring(104,109); + vehicleData.setMotorSpeed(motorSpeed); + + + /** + * 电机转矩 private String motorTorque; + */ + String motorTorque = aa.substring(109, 113); + vehicleData.setMotorTorque(motorTorque); + + /** + * 电机温度 private String motorTemperature; + */ + String motorTemperature = aa.substring(113, 119); + vehicleData.setMotorTemperature(motorTemperature); + + /** + * 电机电压 private String motorVoltage; + */ + + String motorVoltage = aa.substring(119, 124); + vehicleData.setMotorVoltage(motorVoltage); + + /** + * 电机电流private String motorCurrent; + */ + + +// 电机电流: 10446000 + String motorCurrent = aa.substring(124, 132); + vehicleData.setMotorCurrent(motorCurrent); + +// 动力电池剩余电量 SOC: 44103. + /** + * 动力电池剩余电量SOC private BigDecimal remainingBattery; + */ + + String remainingBattery = aa.substring(132, 138); + vehicleData.setRemainingBattery(new BigDecimal(remainingBattery)); + + +// 当前状态允许的最大反馈功率: 400000 + /** + * 当前状态允许的最大反馈功率private String maximumFeedbackPower; + */ + String maximumFeedbackPower = aa.substring(138, 144); + vehicleData.setMaximumFeedbackPower(maximumFeedbackPower); + + +// 当前状态允许最大放电功率: 130000 + /** + * 当前状态允许最大放电功率 private String maximumDischargePower; + */ + + String maximumDischargePower = aa.substring(144, 150); + vehicleData.setMaximumDischargePower(maximumDischargePower); + + +// BMS 自检计数器: 20 + /** + * BMS自检计数器private String selfCheckCounter; + */ + + String selfCheckCounter = aa.substring(150, 152); + vehicleData.setSelfCheckCounter(selfCheckCounter); +// 动力电池充放电电流: 00000 + /** + * 动力电池充放电电流 private String totalBatteryCurrent; + */ + String totalBatteryCurrent = aa.substring(152, 157); + vehicleData.setTotalBatteryCurrent(totalBatteryCurrent); + + +// 动力电池负载端总电压 V3: 605000 + /** + * 动力电池负载端总电压V3 private String totalBatteryVoltage; + */ + String totalBatteryVoltage = aa.substring(157, 163); + vehicleData.setTotalBatteryVoltage(totalBatteryVoltage); + +// 单次最大电压: 4000 + /** + * 单次最大电压 private String singleBatteryMaxVoltage; + */ + + String singleBatteryMaxVoltage = aa.substring(163, 167); + vehicleData.setSingleBatteryMaxVoltage(singleBatteryMaxVoltage); + +// 单体电池最低电压: 3000 + /** + * 单体电池最低电压 private String singleBatteryMinVoltage; + */ + + String singleBatteryMinVoltage = aa.substring(167, 171); + vehicleData.setSingleBatteryMinVoltage(singleBatteryMinVoltage); + +// 单体电池最高温度: 650000 + /** + * 单体电池最高温度 private String singleBatteryMaxTemperature; + */ + String singleBatteryMaxTemperature = aa.substring(171, 177); + vehicleData.setSingleBatteryMaxTemperature(singleBatteryMaxTemperature); + +// 单体电池最低温度: 600000 + /** + * 单体电池最低温度 private String singleBatteryMinTemperature; + */ + String singleBatteryMinTemperature = aa.substring(177, 183); + vehicleData.setSingleBatteryMinTemperature(singleBatteryMinTemperature); + +// 动力电池可用容量: 530000 + /** + * 动力电池可用容量 private String availableBatteryCapacity; + */ + String availableBatteryCapacity = aa.substring(183, 189); + vehicleData.setAvailableBatteryCapacity(availableBatteryCapacity); + + + +// 车辆状态: 0 + String vehicleStatus = aa.substring(189, 190); + vehicleData.setVehicleStatus(Integer.parseInt(vehicleStatus)); + +// 充电状态: 1 + String chargingStatus = aa.substring(190, 191); + vehicleData.setChargingStatus(Integer.parseInt(chargingStatus)); +// 运行状态: 1 + String operatingStatus = aa.substring(191, 192); + vehicleData.setOperatingStatus(Integer.parseInt(operatingStatus)); + +// SOC: 1 + String socStatus = aa.substring(192, 193); + vehicleData.setSocStatus(Integer.parseInt(socStatus)); + +// 可充电储能装置工作状态: 0 + String chargingEnergyStorageStatus = aa.substring(193, 194); + vehicleData.setChargingEnergyStorageStatus(Integer.parseInt(chargingEnergyStorageStatus)); + +// 驱动电机状态: 1 + String driveMotorStatus = aa.substring(194, 195); + vehicleData.setDriveMotorStatus(Integer.parseInt(driveMotorStatus)); + +// 定位是否有效: 1 + String positionStatus = aa.substring(195, 196); + vehicleData.setPositionStatus(Integer.parseInt(positionStatus)); + +// EAS: 1 + String easStatus = aa.substring(196, 197); + vehicleData.setEasStatus(Integer.parseInt(easStatus)); + +// PTC: 1 + String ptcStatus = aa.substring(197, 198); + vehicleData.setPtcStatus(Integer.parseInt(ptcStatus)); + +// EPS: 1 + String epsStatus = aa.substring(198, 199); + vehicleData.setEpsStatus(Integer.parseInt(epsStatus)); + +// ABS: 1 + String absStatus = aa.substring(199, 200); + vehicleData.setAbsStatus(Integer.parseInt(absStatus)); + +// MCU: 1 + String mcuStatus = aa.substring(200, 201); + vehicleData.setMcuStatus(Integer.parseInt(mcuStatus)); + +// 动力电池加热状态: 1 + String heatingStatus = aa.substring(201, 202); + vehicleData.setHeatingStatus(Integer.parseInt(heatingStatus)); + +// 动力电池当前状态: 1 + String batteryStatus = aa.substring(202, 203); + vehicleData.setBatteryStatus(Integer.parseInt(batteryStatus)); + +// 动力电池保温状态: 1 + String batteryInsulationStatus = aa.substring(203, 204); + vehicleData.setBatteryInsulationStatus(Integer.parseInt(batteryInsulationStatus)); + +// DCDC: 1 + String dcdcStatus = aa.substring(204, 205); + vehicleData.setDcdcStatus(Integer.parseInt(dcdcStatus)); + +// CHG: 1 + String chgStatus = aa.substring(205, 206); + vehicleData.setChgStatus(Integer.parseInt(chgStatus)); + System.out.println(vehicleData); + return vehicleData; + } +} diff --git a/muyu-analyze/src/main/resources/bootstrap.yml b/muyu-analyze/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..a829f2f --- /dev/null +++ b/muyu-analyze/src/main/resources/bootstrap.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9008 +# Spring +spring: + application: + # 应用名称 + name: muyu-analyze + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 10.10.26.1:8848 + config: + # 配置中心地址 + server-addr: 10.10.26.1:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # Kafka + kafka: + producer: + key-serializer: org.apache.kafka.common.serialization.StringSerializer + value-serializer: org.apache.kafka.common.serialization.StringSerializer + bootstrap-servers: 10.10.26.5:9092 + consumer: + group-id: group + key-deserializer: org.apache.kafka.common.serialization.StringDeserializer + value-deserializer: org.apache.kafka.common.serialization.StringDeserializer +#kafka: +# topic: test diff --git a/pom.xml b/pom.xml index 6d1f595..400d57b 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,7 @@ 3.6.3 3.6.3 3.6.3 + 3.6.3 @@ -276,11 +277,11 @@ - - - - - + + com.muyu + muyu-analyze + ${muyu.version} + @@ -290,6 +291,9 @@ muyu-visual muyu-modules muyu-common + muyu-analyze + + pom