fix 完善报文解析

master
rouchen 2024-06-28 22:23:06 +08:00
parent c16028c96f
commit e4bcdeefe2
23 changed files with 825 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,73 @@
package com.muyu.iotdb.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author
* @Classname VehicleData
* @Description
* @Date 2021/8/5
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VehicleData {
private String vin; // 车辆识别号
private long timestamp; // 时间戳
private double longitude; // 经度
private double latitude; // 纬度
private int speed; // 速度
private int mileage; // 里程
private Double voltage; // 电压默认为Double而非String以支持数值操作
private Double current; // 电流
private Double 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; // 电机电流
private int remainingBattery; // 剩余电池电量百分比
private int batteryLevel; // 电池等级
private String maximumFeedbackPower; // 最大回馈功率
private String maximumDischargePower; // 最大放电功率
private String selfCheckCounter; // 自检计数器
private String totalBatteryCurrent; // 总电池电流
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; // 运行状态
private int socStatus; // SOC状态
private int chargingEnergyStorageStatus; // 充电储能状态
private int driveMotorStatus; // 驱动电机状态
private int positionStatus; // 位置状态
private int easStatus; // EAS状态假设EAS为某种系统状态
private int ptcStatus; // PTC状态
private int epsStatus; // EPS状态
private int absStatus; // ABS状态
private int mcuStatus; // MCU状态
private int heatingStatus; // 加热状态
private int batteryStatus; // 电池状态
private int batteryInsulationStatus; // 电池绝缘状态
private int dcdcStatus; // DC/DC转换器状态
private int chgStatus; // 充电状态可能与chargingStatus有区别具体看实际业务
private String vehicleStatusMsg; // 车辆状态信息
private String smartHardwareMsg; // 智能硬件信息
private String batteryMsg; // 电池信息
}

View File

@ -0,0 +1,24 @@
package com.muyu.iotdb.model.param;
import lombok.Data;
/**
* description:
* date: 2022/8/15 21:53
* author: YangLe
*/
@Data
public class IotDbParam {
private String vin;
/***
*
*/
private String startTime;
/***
*
*/
private String endTime;
}

View File

@ -0,0 +1,33 @@
package com.muyu.iotdb.model.result;
import lombok.Data;
/**
* description:
* date: 2022/8/15 21:56
* author: YangLe
*/
@Data
public class IotDbResult {
/***
*
*/
private String time;
/***
* PK
*/
private String pk;
/***
*
*/
private String sn;
/***
*
*/
private String breath;
/***
*
*/
private String heart;
}

View File

@ -0,0 +1,77 @@
package com.muyu.iotdb.respone;
/**
* description:
* date: 2022/8/15 21:30
* author: YangLe
*/
public class ErrorResponseData extends ResponseData {
private String exceptionClazz;
ErrorResponseData(String message) {
super(false, DEFAULT_ERROR_CODE, message, message, (Object)null);
}
public ErrorResponseData(Integer code, String message) {
super(false, code, message, message, (Object)null);
}
ErrorResponseData(Integer code, String message, Object object) {
super(false, code, message, object);
}
ErrorResponseData(Integer code, String message, String localizedMsg, Object object) {
super(false, code, message, localizedMsg, object);
}
public boolean equals(final Object o) {
if (o == this) {
return true;
} else if (!(o instanceof ErrorResponseData)) {
return false;
} else {
ErrorResponseData other = (ErrorResponseData)o;
if (!other.canEqual(this)) {
return false;
} else if (!super.equals(o)) {
return false;
} else {
Object this$exceptionClazz = this.getExceptionClazz();
Object other$exceptionClazz = other.getExceptionClazz();
if (this$exceptionClazz == null) {
if (other$exceptionClazz != null) {
return false;
}
} else if (!this$exceptionClazz.equals(other$exceptionClazz)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(final Object other) {
return other instanceof ErrorResponseData;
}
public int hashCode() {
int result = super.hashCode();
Object $exceptionClazz = this.getExceptionClazz();
result = result * 59 + ($exceptionClazz == null ? 43 : $exceptionClazz.hashCode());
return result;
}
public String getExceptionClazz() {
return this.exceptionClazz;
}
public void setExceptionClazz(final String exceptionClazz) {
this.exceptionClazz = exceptionClazz;
}
public String toString() {
return "ErrorResponseData(exceptionClazz=" + this.getExceptionClazz() + ")";
}
}

View File

@ -0,0 +1,214 @@
package com.muyu.iotdb.respone;
/**
* description:
* date: 2022/8/15 21:32
* author: YangLe
*/
public class ResponseData {
public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功";
public static final String DEFAULT_ERROR_MESSAGE = "网络异常";
public static final Integer DEFAULT_SUCCESS_CODE = 200;
public static final Integer DEFAULT_ERROR_CODE = 500;
private Boolean success;
private Integer code;
private String message;
private String localizedMsg;
private Object data;
public ResponseData() {
}
public ResponseData(Boolean success, Integer code, String message, Object data) {
this.success = success;
this.code = code;
this.message = message;
this.data = data;
}
public ResponseData(Boolean success, Integer code, String message, String localizedMsg, Object data) {
this.success = success;
this.code = code;
this.message = message;
this.localizedMsg = localizedMsg;
this.data = data;
}
public ResponseData(Boolean success, Integer code, String message) {
this.success = success;
this.code = code;
this.message = message;
}
public static SuccessResponseData success() {
return new SuccessResponseData();
}
public static SuccessResponseData success(Object object) {
return new SuccessResponseData(object);
}
public static SuccessResponseData success(Integer code, String message, Object object) {
return new SuccessResponseData(code, message, object);
}
public static SuccessResponseData success(Integer code, String message) {
return new SuccessResponseData(code, message);
}
public static SuccessResponseData success(Integer code, String message, String localizedMsg, Object object) {
return new SuccessResponseData(code, message, localizedMsg, object);
}
public static ErrorResponseData error(String message) {
return new ErrorResponseData(message);
}
public static ErrorResponseData error(Integer code, String message) {
return new ErrorResponseData(code, message);
}
public static ErrorResponseData error(Integer code, String message, Object object) {
return new ErrorResponseData(code, message, object);
}
public static ErrorResponseData error(Integer code, String message, String localizedMsg, Object object) {
return new ErrorResponseData(code, message, localizedMsg, object);
}
public Boolean getSuccess() {
return this.success;
}
public Integer getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
public String getLocalizedMsg() {
return this.localizedMsg;
}
public Object getData() {
return this.data;
}
public void setSuccess(final Boolean success) {
this.success = success;
}
public void setCode(final Integer code) {
this.code = code;
}
public void setMessage(final String message) {
this.message = message;
}
public void setLocalizedMsg(final String localizedMsg) {
this.localizedMsg = localizedMsg;
}
public void setData(final Object data) {
this.data = data;
}
public boolean equals(final Object o) {
if (o == this) {
return true;
} else if (!(o instanceof ResponseData)) {
return false;
} else {
ResponseData other = (ResponseData)o;
if (!other.canEqual(this)) {
return false;
} else {
label71: {
Object this$success = this.getSuccess();
Object other$success = other.getSuccess();
if (this$success == null) {
if (other$success == null) {
break label71;
}
} else if (this$success.equals(other$success)) {
break label71;
}
return false;
}
Object this$code = this.getCode();
Object other$code = other.getCode();
if (this$code == null) {
if (other$code != null) {
return false;
}
} else if (!this$code.equals(other$code)) {
return false;
}
label57: {
Object this$message = this.getMessage();
Object other$message = other.getMessage();
if (this$message == null) {
if (other$message == null) {
break label57;
}
} else if (this$message.equals(other$message)) {
break label57;
}
return false;
}
Object this$localizedMsg = this.getLocalizedMsg();
Object other$localizedMsg = other.getLocalizedMsg();
if (this$localizedMsg == null) {
if (other$localizedMsg != null) {
return false;
}
} else if (!this$localizedMsg.equals(other$localizedMsg)) {
return false;
}
Object this$data = this.getData();
Object other$data = other.getData();
if (this$data == null) {
if (other$data == null) {
return true;
}
} else if (this$data.equals(other$data)) {
return true;
}
return false;
}
}
}
protected boolean canEqual(final Object other) {
return other instanceof ResponseData;
}
public int hashCode() {
int result1 = 1;
Object $success = this.getSuccess();
int result = result1 * 59 + ($success == null ? 43 : $success.hashCode());
Object $code = this.getCode();
result = result * 59 + ($code == null ? 43 : $code.hashCode());
Object $message = this.getMessage();
result = result * 59 + ($message == null ? 43 : $message.hashCode());
Object $localizedMsg = this.getLocalizedMsg();
result = result * 59 + ($localizedMsg == null ? 43 : $localizedMsg.hashCode());
Object $data = this.getData();
result = result * 59 + ($data == null ? 43 : $data.hashCode());
return result;
}
public String toString() {
return "ResponseData(success=" + this.getSuccess() + ", code=" + this.getCode() + ", message=" + this.getMessage() + ", localizedMsg=" + this.getLocalizedMsg() + ", data=" + this.getData() + ")";
}
}

View File

@ -0,0 +1,28 @@
package com.muyu.iotdb.respone;
/**
* description:
* date: 2022/8/15 21:40
* author: YangLe
*/
public class SuccessResponseData extends ResponseData {
public SuccessResponseData() {
super(true, DEFAULT_SUCCESS_CODE, "请求成功", "请求成功", (Object)null);
}
public SuccessResponseData(Object object) {
super(true, DEFAULT_SUCCESS_CODE, "请求成功", "请求成功", object);
}
public SuccessResponseData(Integer code, String message, Object object) {
super(true, code, message, message, object);
}
public SuccessResponseData(Integer code, String message, String localizedMsg, Object object) {
super(true, code, message, localizedMsg, object);
}
public SuccessResponseData(Integer code, String message) {
super(true, code, message);
}
}

View File

@ -0,0 +1,25 @@
package com.muyu.iotdb.server;
import com.alibaba.fastjson2.JSONObject;
import com.muyu.iotdb.model.VehicleData;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.springframework.stereotype.Service;
import java.rmi.ServerException;
/**
* description: iot
* date: 2022/8/15 21:41
* author: YangLe
*/
@Service
public interface IotDbServer {
/**
*
*/
void insertData(JSONObject vehicleData) throws StatementExecutionException, ServerException, IoTDBConnectionException;
}

View File

@ -0,0 +1,53 @@
package com.muyu.iotdb.server.impl;
import com.alibaba.fastjson2.JSONObject;
import com.muyu.iotdb.config.IotDBSessionConfig;
import com.muyu.iotdb.model.VehicleData;
import com.muyu.iotdb.server.IotDbServer;
import lombok.extern.log4j.Log4j2;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.session.SessionDataSet;
import org.apache.iotdb.tsfile.read.common.Field;
import org.apache.iotdb.tsfile.read.common.RowRecord;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.rmi.ServerException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* description: iot
* date: 2022/8/15 9:43
* author: yangle
*/
@Log4j2
@Service
public class IotDbServerImpl implements IotDbServer {
@Resource
private IotDBSessionConfig iotDBSessionConfig;
@Override
public void insertData(JSONObject vehicleData) throws StatementExecutionException, ServerException, IoTDBConnectionException {
// iotDbParam: 模拟设备上报消息
// bizkey: 业务唯一key PK :产品唯一编码 SN:设备唯一编码
String deviceId = "root.test." + vehicleData.getString("vin");
// 将设备上报的数据存入数据库(时序数据库)
List<String> measurementsList = new ArrayList<>();
measurementsList.add("vehicleStatusMsg");
List<String> valuesList = new ArrayList<>();
valuesList.add(vehicleData.toString());
log.info("vehicleData:{}", vehicleData);
log.info("valuesList:{}",valuesList);
iotDBSessionConfig.insertRecord(deviceId, vehicleData.getLong("timestamp"), measurementsList, valuesList);
}
}

View File

@ -0,0 +1,30 @@
package com.muyu.mqtt.dao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.apache.iotdb.tsfile.read.filter.operator.In;
import org.checkerframework.checker.units.qual.N;
/**
*
*
* @author Yangle
* Date 2024/6/26 22:30
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
public class MessageDa {
private Integer id;
private String analyzeKey;
private Integer analyzeStart;
private Integer ent;
private String lable;
private String value;
}

View File

@ -0,0 +1,17 @@
package com.muyu.redis;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Redis RedisApplication
*
* @author Yangle
* Date 2024/6/26 16:45
*/
@SpringBootApplication
public class RedisApplication {
public static void main(String[] args) {
}
}

View File

@ -0,0 +1,36 @@
package com.muyu.redis.controller;
import com.muyu.redis.demo.RedisData;
import com.muyu.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
* RedisController
*
* @author Yangle
* Date 2024/6/26 16:48
*/
@RestController
public class RedisController {
@Autowired
private RedisService redisService;
@PostMapping("/redis/set")
public String set(@RequestBody RedisData redisData) {
redisService.set(redisData);
return "success";
}
@PostMapping("/redis/get")
public String get(@RequestBody RedisData redisData) {
return redisService.get(redisData);
}
}

View File

@ -0,0 +1,15 @@
package com.muyu.redis.service;
import com.muyu.redis.demo.RedisData;
/**
* RedisService
*
* @author Yangle
* Date 2024/6/26 16:49
*/
public interface RedisService {
void set(RedisData redisData);
String get(RedisData redisData);
}

View File

@ -0,0 +1,117 @@
package com.muyu.redis.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.muyu.mqtt.dao.MessageDa;
import com.muyu.redis.demo.RedisData;
import com.muyu.redis.service.RedisService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* RedisServiceImpl
*
* @author Yangle
* Date 2024/6/26 16:49
*/
@Service
@Log4j2
public class RedisServiceImpl implements RedisService {
@Autowired
private RedisTemplate<String,String> redisTemplate;
@Override
public void set(RedisData redisData) {
List<MessageDa> messageDas = new ArrayList<>();
messageDas.add(
new MessageDa(
1,
"vin",
0,
17,
"vIN",
"基础信息"
)
);
messageDas.add(
new MessageDa(
2,
"timestamp",
17,
30,
"时间戳",
"基础信息"
)
);
messageDas.add(
new MessageDa(
3,
"longitude",
38,
41,
"经度",
"基础信息"
)
);
redisTemplate.opsForList().set(redisData.getVin(), 0, JSON.toJSONString(messageDas));
}
@Override
public String get(RedisData redisData) {
String string = redisTemplate.opsForValue().get(redisData.getVin());
log.error("string:{}", string);
return null;
// String index = redisTemplate.opsForList().index(redisData.getVin(), 0);
// log.error("index:{}",index);
// // 解析JSON字符串
// JSONArray objects = JSON.parseArray(index);
// log.error("objects:{}",objects);
// for (Object object : objects) {
// JSONObject jsonObject = JSONObject.parseObject(object.toString());
// String typeIdentification = jsonObject.getString("typeIdentification");
// String initiationPosition = jsonObject.getString("initiationPosition");
// String terminatePosition = jsonObject.getString("terminatePosition");
// String messageLabel = jsonObject.getString("messageLabel");
//
// log.error("typeIdentification:{}",typeIdentification);
// log.error("initiationPosition:{}",initiationPosition);
// log.error("terminatePosition:{}",terminatePosition);
// log.error("messageLabel:{}",messageLabel);
// }
//
// // 遍历JSON数组
//// for (int i = 0; i < jsonArray.length(); i++) {
//// // 获取当前项
//// JSONObject jsonObject = jsonArray.getJSONObject(i);
////
//// // 提取initiationPosition的值
//// String initiationPosition = jsonObject.getString("initiationPosition");
////
//// // 打印结果
//// System.out.println("initiationPosition at index " + i + " is: " + initiationPosition);
//// }
// return null;
}
/**
*
*/
Cache<String, String> localCache = Caffeine.newBuilder()
.initialCapacity(5)
.maximumSize(10)
//过期时间3秒钟
.expireAfterWrite(5, TimeUnit.SECONDS)
.build();
}

View File

@ -0,0 +1,27 @@
package com.muyu.test;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@RequiredArgsConstructor
public class Application implements CommandLineRunner {
private final UserRegistrationService userRegistrationService;
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebApplicationType(WebApplicationType.NONE);
app.run(args);
}
@Override
public void run(String... args) {
// 在启动时注册新用户
userRegistrationService.registerUser("小猪猪");
}
}

View File

@ -0,0 +1,16 @@
package com.muyu.test;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class UserNotificationService {
@EventListener
public void handleUserRegisteredEvent(UserRegisteredEvent event) {
// 处理用户注册事件,例如发送通知
String username = event.getUsername();
System.out.println("Notification sent for user: " + username);
}
}

View File

@ -0,0 +1,19 @@
package com.muyu.test;
import org.springframework.context.ApplicationEvent;
public class UserRegisteredEvent extends ApplicationEvent {
private final String username;
public UserRegisteredEvent(Object source, String username) {
super(source);
this.username = username;
}
public String getUsername() {
return username;
}
}

View File

@ -0,0 +1,21 @@
package com.muyu.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
@Service
public class UserRegistrationService {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void registerUser(String username) {
// 注册新用户逻辑
// ...
// 发布用户注册事件,这里使用 eventPublisher 将 预先定义好的事件交由 Spring 的Event Channel 管理
eventPublisher.publishEvent(new UserRegisteredEvent(this, username));
}
}