From 92f486ebb05016abc733fc60ca7ed8bdd161ad5b Mon Sep 17 00:00:00 2001
From: Saisai Liu <1374434128@qq.com>
Date: Thu, 6 Jun 2024 14:02:20 +0800
Subject: [PATCH] =?UTF-8?q?feat():=E6=8A=A5=E6=96=87=E8=A7=A3=E6=9E=90?=
=?UTF-8?q?=E5=AE=8C=E6=AF=95=EF=BC=8C=E5=AD=98=E5=85=A5=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E8=BD=A6=E8=BE=86=E4=BF=A1=E6=81=AF=E5=AF=B9=E8=B1=A1?=
=?UTF-8?q?=EF=BC=8C=E4=B8=8B=E4=B8=80=E6=AD=A5->=E5=AD=98=E5=85=A5kafka--?=
=?UTF-8?q?topic--=E5=88=86=E5=8C=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/inspectionProfiles/Project_Default.xml | 14 +
.idea/uiDesigner.xml | 124 +++++
pom.xml | 15 +-
src/main/java/com/mobai/MqttApplication.java | 2 +-
src/main/java/com/mobai/MqttRunner.java | 48 ++
.../java/com/mobai/api/SubscribeSample.java | 37 +-
.../java/com/mobai/cofig/MqttFactory.java | 6 +-
.../java/com/mobai/cofig/MqttProperties.java | 2 +-
.../java/com/mobai/cofig/RabbitConfig.java | 2 +-
.../java/com/mobai/domian/GetOptions.java | 2 +-
.../java/com/mobai/domian/HttpStatus.java | 93 ++++
.../mobai/domian/MqttCallBackServiceImpl.java | 161 +++++-
.../com/mobai/domian/MqttServerModel.java | 28 +
src/main/java/com/mobai/domian/Result.java | 101 ++++
src/main/java/com/mobai/domian/Vehicle.java | 207 +++++++
.../java/com/mobai/domian/VehicleData.java | 520 ++++++++++++++++++
.../com/mobai/rabbitMq/MessageHandler.java | 2 +-
src/main/java/com/mobai/remote/MyClient.java | 16 +
.../com/mobai/util/CalculateCheckDigit.java | 44 ++
src/main/java/com/mobai/util/ConnectMqtt.java | 43 ++
.../java/com/mobai/util/ConversionUtil.java | 68 +++
.../java/com/mobai/util/MqttProperties.java | 46 ++
src/main/resources/application.yml | 18 +
23 files changed, 1564 insertions(+), 35 deletions(-)
create mode 100644 .idea/inspectionProfiles/Project_Default.xml
create mode 100644 .idea/uiDesigner.xml
create mode 100644 src/main/java/com/mobai/MqttRunner.java
create mode 100644 src/main/java/com/mobai/domian/HttpStatus.java
create mode 100644 src/main/java/com/mobai/domian/MqttServerModel.java
create mode 100644 src/main/java/com/mobai/domian/Result.java
create mode 100644 src/main/java/com/mobai/domian/Vehicle.java
create mode 100644 src/main/java/com/mobai/domian/VehicleData.java
create mode 100644 src/main/java/com/mobai/remote/MyClient.java
create mode 100644 src/main/java/com/mobai/util/CalculateCheckDigit.java
create mode 100644 src/main/java/com/mobai/util/ConnectMqtt.java
create mode 100644 src/main/java/com/mobai/util/ConversionUtil.java
create mode 100644 src/main/java/com/mobai/util/MqttProperties.java
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..ee2c34b
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 96b39a5..a7a779c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -79,8 +79,6 @@
spring-boot-starter-data-redis
-
-
org.apache.poi
@@ -88,6 +86,19 @@
4.1.2
+
+ com.dtflys.forest
+ forest-spring-boot-starter
+ 1.5.36
+
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ 2.0.46
+
+
+
diff --git a/src/main/java/com/mobai/MqttApplication.java b/src/main/java/com/mobai/MqttApplication.java
index 5cf4718..14da1b9 100644
--- a/src/main/java/com/mobai/MqttApplication.java
+++ b/src/main/java/com/mobai/MqttApplication.java
@@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ClassName MqttApplication
* @Description 描述
- * @Author SaiSai.Liu
+ * @Author Mobai
* @Date 2024/5/31 14:33
*/
@Log
diff --git a/src/main/java/com/mobai/MqttRunner.java b/src/main/java/com/mobai/MqttRunner.java
new file mode 100644
index 0000000..6b29c0f
--- /dev/null
+++ b/src/main/java/com/mobai/MqttRunner.java
@@ -0,0 +1,48 @@
+package com.mobai;
+
+import com.mobai.domian.MqttServerModel;
+import com.mobai.domian.Result;
+import com.mobai.remote.MyClient;
+import com.mobai.util.ConnectMqtt;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.servlet.ServletException;
+import java.util.List;
+
+/**
+ * @ClassName MqttRunner
+ * @Description 描述
+ * @Author Mobai
+ * @Date 2024/6/5 19:09
+ */
+@Component
+public class MqttRunner implements ApplicationRunner {
+ @Autowired
+ private MyClient myClient;
+
+ @Autowired
+ private ConnectMqtt conn;
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ // 获取初始服务器配置 IP + topic
+ Result> ips = myClient.getIps();
+ if (ips.getData()==null){
+ throw new ServletException("获取初始节点信息失败");
+ }
+ System.out.println(ips);
+ List mqttServerModels = ips.getData();
+ mqttServerModels.forEach(mqttServerModel -> {
+ try {
+ // 监控队列消息
+ conn.connectMq(mqttServerModel);
+ } catch (ServletException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+}
diff --git a/src/main/java/com/mobai/api/SubscribeSample.java b/src/main/java/com/mobai/api/SubscribeSample.java
index 985162b..302507c 100644
--- a/src/main/java/com/mobai/api/SubscribeSample.java
+++ b/src/main/java/com/mobai/api/SubscribeSample.java
@@ -1,33 +1,22 @@
package com.mobai.api;
-import com.mobai.domian.GetOptions;
-import com.mobai.domian.MqttCallBackServiceImpl;
-import com.mobai.cofig.MqttFactory;
-import com.mobai.cofig.MqttProperties;
-import org.eclipse.paho.client.mqttv3.*;
+import com.mobai.domian.MqttServerModel;
+import com.mobai.util.ConnectMqtt;
+
+import javax.servlet.ServletException;
public class SubscribeSample {
- public static void main(String[] args) {
- MqttProperties mqttProperties = MqttProperties.configBuild("39.98.69.92", "topic0");
-// MqttProperties mqttProperties = new MqttProperties();
-// mqttProperties.setBroker("tcp://39.98.69.92:1883");
-// mqttProperties.setTopic("mqtt/test");
- mqttProperties.setUsername("emqx");
- mqttProperties.setPassword("public");
-// mqttProperties.setClientid("subscribe_client");
- int qos = 0;
+
+ public static void main(String[] args) {
+ ConnectMqtt mqtt = new ConnectMqtt();
try {
- MqttClient client = new MqttFactory(new MqttCallBackServiceImpl()).buildOptions(mqttProperties);
- // 连接参数
- MqttConnectOptions options = GetOptions.getMqttOptions(mqttProperties);
- // 设置回调
- client.setCallback(new MqttCallBackServiceImpl());
- // 进行连接
- client.connect(options);
- client.subscribe(mqttProperties.getTopic(), qos);
- } catch (Exception e) {
- e.printStackTrace();
+ mqtt.connectMq(new MqttServerModel() {{
+ setBroker("39.98.69.92");
+ setTopic("topic0");
+ }});
+ } catch (ServletException e) {
+ throw new RuntimeException(e);
}
}
}
diff --git a/src/main/java/com/mobai/cofig/MqttFactory.java b/src/main/java/com/mobai/cofig/MqttFactory.java
index afe8bba..cffbfff 100644
--- a/src/main/java/com/mobai/cofig/MqttFactory.java
+++ b/src/main/java/com/mobai/cofig/MqttFactory.java
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
/**
* @ClassName MqttFactory
* @Description 描述
- * @Author SaiSai.Liu
+ * @Author Mobai
* @Date 2024/5/31 11:35
*/
@@ -29,8 +29,8 @@ public class MqttFactory {
mqttProperties.getBroker(),
mqttProperties.getClientid(),
new MemoryPersistence());
- MqttConnectOptions optionas = GetOptions.getMqttOptions(mqttProperties);
- client.connect(optionas);
+ MqttConnectOptions options = GetOptions.getMqttOptions(mqttProperties);
+ client.connect(options);
client.setCallback(mqttCallBackService);
client.subscribe(mqttProperties.getTopic(), 0);
diff --git a/src/main/java/com/mobai/cofig/MqttProperties.java b/src/main/java/com/mobai/cofig/MqttProperties.java
index 2ea9031..88f05f9 100644
--- a/src/main/java/com/mobai/cofig/MqttProperties.java
+++ b/src/main/java/com/mobai/cofig/MqttProperties.java
@@ -10,7 +10,7 @@ import java.util.UUID;
/**
* @ClassName MqttProperties
* @Description 描述
- * @Author SaiSai.Liu
+ * @Author Mobai
* @Date 2024/5/30 20:05
*/
@Data
diff --git a/src/main/java/com/mobai/cofig/RabbitConfig.java b/src/main/java/com/mobai/cofig/RabbitConfig.java
index 5d61ead..a48da1e 100644
--- a/src/main/java/com/mobai/cofig/RabbitConfig.java
+++ b/src/main/java/com/mobai/cofig/RabbitConfig.java
@@ -7,7 +7,7 @@ import org.springframework.context.annotation.Configuration;
/**
* @ClassName RabbitConfig
* @Description 描述
- * @Author SaiSai.Liu
+ * @Author Mobai
* @Date 2024/5/31 21:47
*/
@Configuration
diff --git a/src/main/java/com/mobai/domian/GetOptions.java b/src/main/java/com/mobai/domian/GetOptions.java
index f92ecb1..5e0e421 100644
--- a/src/main/java/com/mobai/domian/GetOptions.java
+++ b/src/main/java/com/mobai/domian/GetOptions.java
@@ -8,7 +8,7 @@ import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
* 获取Mqtt连接参数
* @ClassName GetOptions
* @Description 获取Mqtt连接参数
- * @Author SaiSai.Liu
+ * @Author Mobai
* @Date 2024/5/31 14:26
*/
diff --git a/src/main/java/com/mobai/domian/HttpStatus.java b/src/main/java/com/mobai/domian/HttpStatus.java
new file mode 100644
index 0000000..6aa9cb9
--- /dev/null
+++ b/src/main/java/com/mobai/domian/HttpStatus.java
@@ -0,0 +1,93 @@
+package com.mobai.domian;
+
+/**
+ * 返回状态码
+ *
+ * @author Mobai
+ */
+public class HttpStatus {
+ /**
+ * 操作成功
+ */
+ public static final int SUCCESS = 200;
+
+ /**
+ * 对象创建成功
+ */
+ public static final int CREATED = 201;
+
+ /**
+ * 请求已经被接受
+ */
+ public static final int ACCEPTED = 202;
+
+ /**
+ * 操作已经执行成功,但是没有返回数据
+ */
+ public static final int NO_CONTENT = 204;
+
+ /**
+ * 资源已被移除
+ */
+ public static final int MOVED_PERM = 301;
+
+ /**
+ * 重定向
+ */
+ public static final int SEE_OTHER = 303;
+
+ /**
+ * 资源没有被修改
+ */
+ public static final int NOT_MODIFIED = 304;
+
+ /**
+ * 参数列表错误(缺少,格式不匹配)
+ */
+ public static final int BAD_REQUEST = 400;
+
+ /**
+ * 未授权
+ */
+ public static final int UNAUTHORIZED = 401;
+
+ /**
+ * 访问受限,授权过期
+ */
+ public static final int FORBIDDEN = 403;
+
+ /**
+ * 资源,服务未找到
+ */
+ public static final int NOT_FOUND = 404;
+
+ /**
+ * 不允许的http方法
+ */
+ public static final int BAD_METHOD = 405;
+
+ /**
+ * 资源冲突,或者资源被锁
+ */
+ public static final int CONFLICT = 409;
+
+ /**
+ * 不支持的数据,媒体类型
+ */
+ public static final int UNSUPPORTED_TYPE = 415;
+
+ /**
+ * 系统内部错误
+ */
+ public static final int ERROR = 500;
+
+ /**
+ * 接口未实现
+ */
+ public static final int NOT_IMPLEMENTED = 501;
+
+ /**
+ * 系统警告消息
+ */
+ public static final int WARN = 601;
+}
diff --git a/src/main/java/com/mobai/domian/MqttCallBackServiceImpl.java b/src/main/java/com/mobai/domian/MqttCallBackServiceImpl.java
index 680f6a4..eae57d8 100644
--- a/src/main/java/com/mobai/domian/MqttCallBackServiceImpl.java
+++ b/src/main/java/com/mobai/domian/MqttCallBackServiceImpl.java
@@ -5,11 +5,15 @@ import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
+
+import static com.mobai.util.ConversionUtil.hexStringToString;
+
/**
* 回执消息类
* @ClassName MqttCallBackServiceImpl
* @Description 回执消息类
- * @Author SaiSai.Liu
+ * @Author Mobai
* @Date 2024/5/30 20:02
*/
@Service
@@ -19,11 +23,166 @@ public class MqttCallBackServiceImpl implements MqttCallback {
System.out.println("connectionLost: " + cause.getMessage());
}
+ // 获取报文 并 处理
@Override
public void messageArrived(String topic, MqttMessage message) {
System.out.println("topic: " + topic);
System.out.println("Qos: " + message.getQos());
System.out.println("message content: " + new String(message.getPayload()));
+
+ String hexStr = "7E 56 49 4e 31 32 33 34 35 36 37 38 39 44 49 4a 45 34 31 37 31 37 35 39 31 33 35 33 30 37 34 31 31 36 2e 37 32 31 34 31 37 30 33 39 2e 35 32 38 37 34 33 30 33 36 2e 30 30 30 32 36 2e 36 32 36 30 30 30 30 30 32 36 32 30 30 30 32 38 30 30 30 32 36 39 31 30 30 30 30 30 44 34 30 38 30 31 31 2e 32 30 37 30 30 30 30 30 37 36 32 32 32 35 37 37 30 31 33 39 30 30 30 31 35 31 30 30 31 33 37 38 35 30 30 30 34 34 37 37 30 2e 31 34 30 30 30 30 37 39 30 30 30 30 30 30 35 30 30 30 30 35 39 36 30 30 30 33 30 30 30 34 30 30 30 35 30 30 30 30 30 32 35 30 30 30 30 32 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 26 7E";
+ // 报文
+ String str = hexStringToString(hexStr);
+ System.out.println(hexStr);
+ System.out.println(hexStr.length());
+ System.out.println(str);
+ System.out.println(str.length());
+ String trainMsg = str.substring(1, str.length() - 2);
+ // 解析报文具体数据
+ String vin = trainMsg.substring(0, 17); // 车辆vin
+ String timestamp = trainMsg.substring(17, 30); // 时间戳
+ String longitude = trainMsg.substring(30, 41); // 经度
+ String latitude = trainMsg.substring(41, 51); // 纬度
+ String speed = trainMsg.substring(51, 57); // 速度
+// String mileage = trainMsg.substring(57, 68); // 总里程
+ BigDecimal mileage = new BigDecimal(trainMsg.substring(57, 68));
+// System.out.println("转换值"+mileage);
+ String voltage = trainMsg.substring(68, 74); // 总电压
+ String current = trainMsg.substring(74, 79); // 总电流
+ String resistance = trainMsg.substring(79, 88); // 绝缘电阻
+ String gear = trainMsg.substring(88, 89); // 档位
+ String accelerationPedal = trainMsg.substring(89, 91); // 加速踏板行程值
+ String brakePedal = trainMsg.substring(91, 93); // 制动踏板行程值
+ String fuelConsumptionRate = trainMsg.substring(93, 98); // 燃料消耗率
+ String motorControllerTemperature = trainMsg.substring(98, 104); // 电机控制器温度
+ String motorSpeed = trainMsg.substring(104, 109); // 电机转速
+ String motoTorque = trainMsg.substring(109, 113); //电机转矩
+ String motorTemperature = trainMsg.substring(113, 119); // 电机温度
+ String motorVoltage = trainMsg.substring(119, 124); // 电机电压
+ String motorCurrent = trainMsg.substring(124, 132); // 电机电流
+ BigDecimal remainingBattery = new BigDecimal(trainMsg.substring(132, 138)); // 动力电池剩余电量SOC
+ BigDecimal maximumFeedbackPower = new BigDecimal(trainMsg.substring(138, 144)); // 当前状态允许的最大反馈功率
+ String maximumDischargePower = trainMsg.substring(144, 150); // 当前状态允许的最大放电功率
+ String selfCheckCounter = trainMsg.substring(150, 152); // BMS自检计数器
+ String totalBatteryCurrent = trainMsg.substring(152, 157); // 动力电池充放电电流
+ String totalBatteryVoltage = trainMsg.substring(157, 163); // 动力电池负载端总电压V3
+ String singleBatteryMaxVoltage = trainMsg.substring(163, 167); // 单次最大电压
+ String singleBatteryMinVoltage = trainMsg.substring(167, 171); // 单次最低电压
+ String singleBatteryMaxTemperature = trainMsg.substring(171, 177); // 单体电池最高温度
+ String singleBatteryMinTemperature = trainMsg.substring(177, 183); // 单体电池最低温度
+ String availableBatteryCapacity = trainMsg.substring(183, 189); // 动力电池可用容量
+ Integer vehicleStatus = Integer.valueOf(trainMsg.substring(189, 190)); // 车辆状态
+ Integer chargingStatus = Integer.valueOf(trainMsg.substring(190, 191)); // 充电状态
+ Integer operatingStatus = Integer.valueOf(trainMsg.substring(191, 192)); // 运行状态
+ Integer chargingEnergyStorageStatus = Integer.valueOf(trainMsg.substring(192, 193)); // SOC
+ Integer driveMotorStatus = Integer.valueOf(trainMsg.substring(193, 194)); // 可充电储能装置工作状态
+ Integer positionStatus = Integer.valueOf(trainMsg.substring(194, 195)); // 定位是否有效
+ Integer easStatus = Integer.valueOf(trainMsg.substring(195, 196)); // EAS(汽车防盗系统)状态
+ Integer ptcStatus = Integer.valueOf(trainMsg.substring(196, 197)); // PTC(主动安全系统)状态
+ Integer epsStatus = Integer.valueOf(trainMsg.substring(197, 198)); // EPS(电动助力系统)状态
+ Integer absStatus = Integer.valueOf(trainMsg.substring(198, 199)); // ABS(防抱死)状态
+ Integer mcuStatus = Integer.valueOf(trainMsg.substring(199, 200)); // MCU(电机/逆变器)状态
+ Integer heatingStatus = Integer.valueOf(trainMsg.substring(200, 201)); // 动力电池加热状态
+ Integer batteryStatus = Integer.valueOf(trainMsg.substring(201, 202)); // 动力电池当前状态
+ Integer batteryInsulationStatus = Integer.valueOf(trainMsg.substring(202, 203)); // 动力电池保温状态
+ Integer dcdcStatus = Integer.valueOf(trainMsg.substring(203, 204)); // DCDC(电力交换系统)状态
+ Integer chgStatus = Integer.valueOf(trainMsg.substring(204, 205)); // CHG(充电机)状态
+
+ Vehicle vehicle = new Vehicle(vin,
+ timestamp,
+ longitude,
+ latitude,
+ speed,
+ mileage,
+ voltage,
+ current,
+ resistance,
+ gear,
+ accelerationPedal,
+ brakePedal,
+ fuelConsumptionRate,
+ motorControllerTemperature,
+ motorSpeed,
+ motoTorque,
+ motorTemperature,
+ motorVoltage,
+ motorCurrent,
+ remainingBattery,
+ maximumFeedbackPower,
+ maximumDischargePower,
+ selfCheckCounter,
+ totalBatteryCurrent,
+ totalBatteryVoltage,
+ singleBatteryMaxVoltage,
+ singleBatteryMinVoltage,
+ singleBatteryMaxTemperature,
+ singleBatteryMinTemperature,
+ availableBatteryCapacity,
+ vehicleStatus,
+ chargingStatus,
+ operatingStatus,
+ chargingEnergyStorageStatus,
+ driveMotorStatus,
+ positionStatus,
+ easStatus,
+ ptcStatus,
+ epsStatus,
+ absStatus,
+ mcuStatus,
+ heatingStatus,
+ batteryStatus,
+ batteryInsulationStatus,
+ dcdcStatus,
+ chgStatus);
+ System.out.println(
+ "车辆vin:" + vin + "\n\t" +
+ "时间戳:" + timestamp + "\n\t" +
+ "经度:" + longitude + "\n\t" +
+ "纬度:" + latitude + "\n\t" +
+ "速度:" + speed + "\n\t" +
+ "总里程:" + mileage + "\n\t" +
+ "总电压:" + voltage + "\n\t" +
+ "总电流:" + current + "\n\t" +
+ "绝缘电阻:" + resistance + "\n\t" +
+ "档位:" + gear + "\n\t" +
+ "加速踏板行程值:" + accelerationPedal + "\n\t" +
+ "制动踏板行程值:" + brakePedal + "\n\t" +
+ "燃料消耗率:" + fuelConsumptionRate + "\n\t" +
+ "电机控制器温度:" + motorControllerTemperature + "\n\t" +
+ "电机转速:" + motorSpeed + "\n\t" +
+ "电机转矩:" + motoTorque + "\n\t" +
+ "电机温度:" + motorTemperature + "\n\t" +
+ "电机电压:" + motorVoltage + "\n\t" +
+ "电机电流:" + motorCurrent + "\n\t" +
+ "动力电池剩余电量SOC:" + remainingBattery + "\n\t" +
+ "当前状态允许的最大反馈功率:" + maximumFeedbackPower + "\n\t" +
+ "当前状态允许的最大放电功率:" + maximumDischargePower + "\n\t" +
+ "BMS自检计数器:" + totalBatteryCurrent + "\n\t" +
+ "动力电池充放电电流:" + selfCheckCounter + "\n\t" +
+ "动力电池负载端总电压V3:" + totalBatteryVoltage + "\n\t" +
+ "单次最大电压:" + singleBatteryMaxVoltage + "\n\t" +
+ "单次最低电压:" + singleBatteryMinVoltage + "\n\t" +
+ "单体电池最高温度:" + singleBatteryMaxTemperature + "\n\t" +
+ "单体电池最低温度:" + singleBatteryMinTemperature + "\n\t" +
+ "动力电池可用容量:" + availableBatteryCapacity + "\n\t" +
+ "车辆状态:" + vehicleStatus + "\n\t" +
+ "充电状态:" + chargingStatus + "\n\t" +
+ "运行状态:" + operatingStatus + "\n\t" +
+ "SOC:" + chargingEnergyStorageStatus + "\n\t" +
+ "可充电储能装置工作状态:" + driveMotorStatus + "\n\t" +
+ "定位是否有效:" + positionStatus + "\n\t" +
+ "EAS(汽车防盗系统)状态:" + easStatus + "\n\t" +
+ "PTC(主动安全系统)状态:" + ptcStatus + "\n\t" +
+ "EPS(电动助力系统)状态:" + epsStatus + "\n\t" +
+ "ABS(防抱死)状态:" + absStatus + "\n\t" +
+ "MCU(电机/逆变器)状态:" + mcuStatus + "\n\t" +
+ "动力电池加热状态:" + heatingStatus + "\n\t" +
+ "动力电池当前状态:" + batteryStatus + "\n\t" +
+ "动力电池保温状态:" + batteryInsulationStatus + "\n\t" +
+ "DCDC(电力交换系统)状态:" + dcdcStatus + "\n\t" +
+ "CHG(充电机)状态:" + chgStatus
+ );
+
}
@Override
diff --git a/src/main/java/com/mobai/domian/MqttServerModel.java b/src/main/java/com/mobai/domian/MqttServerModel.java
new file mode 100644
index 0000000..8ae222a
--- /dev/null
+++ b/src/main/java/com/mobai/domian/MqttServerModel.java
@@ -0,0 +1,28 @@
+package com.mobai.domian;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author DongZl
+ * @description: Mqtt服务器模型
+ * @Date 2024-3-26 上午 09:53
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MqttServerModel {
+
+ /**
+ * MQTT服务节点
+ */
+ private String broker;
+
+ /**
+ * MQTT订阅主题
+ */
+ private String topic;
+}
diff --git a/src/main/java/com/mobai/domian/Result.java b/src/main/java/com/mobai/domian/Result.java
new file mode 100644
index 0000000..47af9da
--- /dev/null
+++ b/src/main/java/com/mobai/domian/Result.java
@@ -0,0 +1,101 @@
+package com.mobai.domian;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 响应信息主体
+ *
+ * @author Mobai
+ */
+@Data
+public class Result implements Serializable {
+ /**
+ * 成功
+ */
+ public static final int SUCCESS = HttpStatus.SUCCESS;
+ /**
+ * 失败
+ */
+ public static final int FAIL = HttpStatus.ERROR;
+ private static final long serialVersionUID = 1L;
+ /**
+ * 系统警告消息
+ */
+ private static final int WARN = HttpStatus.WARN;
+
+ private int code;
+
+ private String msg;
+
+ private T data;
+
+ public static Result success () {
+ return restResult(null, SUCCESS, "操作成功");
+ }
+
+ public static Result success (T data) {
+ return restResult(data, SUCCESS, "操作成功");
+ }
+
+ public static Result success (T data, String msg) {
+ return restResult(data, SUCCESS, msg);
+ }
+
+ public static Result error () {
+ return restResult(null, FAIL, "操作失败");
+ }
+
+ public static Result error (String msg) {
+ return restResult(null, FAIL, msg);
+ }
+
+ public static Result error (T data) {
+ return restResult(data, FAIL, "操作失败");
+ }
+
+ public static Result error (T data, String msg) {
+ return restResult(data, FAIL, msg);
+ }
+
+ public static Result error (int code, String msg) {
+ return restResult(null, code, msg);
+ }
+
+ public static Result warn () {
+ return restResult(null, WARN, "操作失败");
+ }
+
+ public static Result warn (String msg) {
+ return restResult(null, WARN, msg);
+ }
+
+ public static Result warn (T data) {
+ return restResult(data, WARN, "操作失败");
+ }
+
+ public static Result warn (T data, String msg) {
+ return restResult(data, WARN, msg);
+ }
+
+ public static Result warn (int code, String msg) {
+ return restResult(null, code, msg);
+ }
+
+ private static Result restResult (T data, int code, String msg) {
+ Result apiResult = new Result<>();
+ apiResult.setCode(code);
+ apiResult.setData(data);
+ apiResult.setMsg(msg);
+ return apiResult;
+ }
+
+ public static Boolean isError (Result ret) {
+ return !isSuccess(ret);
+ }
+
+ public static Boolean isSuccess (Result ret) {
+ return Result.SUCCESS == ret.getCode();
+ }
+}
diff --git a/src/main/java/com/mobai/domian/Vehicle.java b/src/main/java/com/mobai/domian/Vehicle.java
new file mode 100644
index 0000000..6e173ae
--- /dev/null
+++ b/src/main/java/com/mobai/domian/Vehicle.java
@@ -0,0 +1,207 @@
+package com.mobai.domian;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * 车辆数据信息
+ * @author Mobai
+ * @className Vehicle
+ * @description 描述
+ * @date 2024/6/6 8:18
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class Vehicle {
+ /**
+ * 车辆vin
+ */
+ private String vin;
+ /**
+ * 时间戳
+ */
+ private String timestamp;
+ /**
+ * 经度
+ */
+ 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 motoTorque;
+ /**
+ * 电机温度
+ */
+ private String motorTemperature;
+ /**
+ * 电机电压
+ */
+ private String motorVoltage;
+ /**
+ * 电机电流
+ */
+ private String motorCurrent;
+ /**
+ * 动力电池剩余电量SOC
+ */
+ private BigDecimal remainingBattery;
+ /**
+ * 当前状态允许的最大反馈功率
+ */
+ private BigDecimal 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 Integer vehicleStatus;
+ /**
+ * 充电状态
+ */
+ private Integer chargingStatus;
+ /**
+ * 运行状态
+ */
+ private Integer operatingStatus;
+ /**
+ * SOC
+ */
+ private Integer chargingEnergyStorageStatus;
+ /**
+ * 可充电储能装置工作状态
+ */
+ private Integer driveMotorStatus;
+ /**
+ * 定位是否有效
+ */
+ private Integer positionStatus;
+ /**
+ * EAS
+ */
+ private Integer easStatus;
+ /**
+ * PTC
+ */
+ private Integer ptcStatus;
+ /**
+ * EPS
+ */
+ private Integer epsStatus;
+ /**
+ * ABS
+ */
+ private Integer absStatus;
+ /**
+ * MCU
+ */
+ private Integer mcuStatus;
+ /**
+ * 动力电池加热状态
+ */
+ private Integer heatingStatus;
+ /**
+ * 动力电池当前状态
+ */
+ private Integer batteryStatus;
+ /**
+ * 动力电池保温状态
+ */
+ private Integer batteryInsulationStatus;
+ /**
+ * DCDC
+ */
+ private Integer dcdcStatus;
+ /**
+ * CHG
+ */
+ private Integer chgStatus;
+
+}
diff --git a/src/main/java/com/mobai/domian/VehicleData.java b/src/main/java/com/mobai/domian/VehicleData.java
new file mode 100644
index 0000000..123f564
--- /dev/null
+++ b/src/main/java/com/mobai/domian/VehicleData.java
@@ -0,0 +1,520 @@
+//package com.mobai.domian;
+//
+//
+//import lombok.AllArgsConstructor;
+//import lombok.Builder;
+//import lombok.Data;
+//import lombok.NoArgsConstructor;
+//
+//import java.math.BigDecimal;
+//
+//
+//
+///**
+// * 报文解析
+// * @author Mobai
+// * @Classname VehicleData
+// * @Description 车辆模拟数据对象
+// * @Date 2021/8/5
+// */
+//@Data
+//@Builder
+//@NoArgsConstructor
+//@AllArgsConstructor
+//public class VehicleData {
+// /**
+// * VIN
+// */
+// private String vin;
+// /**
+// * 行驶路线
+// */
+// 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 = 1;
+//
+// /**
+// * 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;
+//
+// public String getMsg(){
+// //第一位VIN
+// return vin +
+// // 当前时间戳
+// System.currentTimeMillis() +
+// //第二位经度 longitude latitude
+// getValue(longitude, 11) +
+// //第三位维度 longitude latitude
+// getValue(latitude, 10) +
+// //车速
+// getValue(speed, 6) +
+// //总里程
+// getValue(mileage == null ? "" : mileage.toString(), 11) +
+// // 总电压
+// getValue(voltage, 6) +
+// //总电流
+// getValue(current, 5) +
+// //绝缘电阻 79 - 87
+// getValue(resistance, 9) +
+// //档位
+// (gear == null ? "D" : gear) +
+// // 加速踏板行程值
+// getValue(accelerationPedal, 2) +
+// // 制动踏板行程值
+// getValue(brakePedal, 2) +
+// // 燃料消耗率
+// getValue(fuelConsumptionRate, 5) +
+// //电机控制器温度
+// getValue(motorControllerTemperature, 6) +
+// //电机转速
+// getValue(motorSpeed, 5) +
+// //点击转矩
+// getValue(motorTorque, 4) +
+// //电机温度
+// getValue(motorTemperature, 6) +
+// //电机电压
+// getValue(motorVoltage, 5) +
+// //电机电流
+// getValue(motorCurrent, 8) +
+// //动力电池剩余电量SOC
+// getValue(remainingBattery == null ? "" : remainingBattery.toString(), 6) +
+// //当前状态允许的最大反馈功率
+// getValue(maximumFeedbackPower, 6) +
+// //当前状态允许最大放电功率
+// getValue(maximumDischargePower, 6) +
+// //BMS自检计数器
+// getValue(selfCheckCounter, 2) +
+// //动力电池充放电电流
+// getValue(totalBatteryCurrent, 5) +
+// //动力电池负载端总电压V3
+// getValue(totalBatteryVoltage, 6) +
+// //单次最大电压
+// getValue(singleBatteryMaxVoltage, 4) +
+// //单体电池最低电压
+// getValue(singleBatteryMinVoltage, 4) +
+// //单体电池最高温度
+// getValue(singleBatteryMaxTemperature, 6) +
+// //单体电池最低温度
+// getValue(singleBatteryMinTemperature, 6) +
+// //动力电池可用容量
+// getValue(availableBatteryCapacity, 6) +
+// //车辆状态
+// vehicleStatus +
+// //充电状态
+// chargingStatus +
+// //运行状态
+// operatingStatus +
+// //SOC
+// socStatus +
+// //可充电储能装置工作状态
+// chargingEnergyStorageStatus +
+// //驱动电机状态
+// driveMotorStatus +
+// //定位是否有效
+// positionStatus +
+// //EAS
+// easStatus +
+// //PTC
+// ptcStatus +
+// //EPS
+// epsStatus +
+// //ABS
+// absStatus +
+// //MCU
+// mcuStatus +
+// //动力电池加热状态
+// heatingStatus +
+// //动力电池当前状态
+// batteryStatus +
+// //动力电池保温状态
+// batteryInsulationStatus +
+// //DCDC
+// dcdcStatus +
+// //CHG
+// chgStatus;
+// }
+//
+// public String getValue(String val , int valLength){
+// if(val == null){
+// val = "";
+// }
+// int length = val.length();
+// if (length > valLength){
+// return val.substring( 0 , valLength);
+// }
+// val = val + "0".repeat(valLength - length);
+// return val;
+// }
+//
+// /**
+// * 汽车对象构造企业VIN
+// * @param vehicle 汽车对象
+// * @return 汽车数据对象
+// */
+// public static VehicleData vehicleBuild (Vehicle vehicle) {
+// return VehicleData.builder()
+// .vin(vehicle.getVin())
+// .gear("P")
+// .remainingBattery(vehicle.getRemainingBattery())
+// .batteryLevel(vehicle.getBatteryLevel())
+// .mileage(vehicle.getTotalMileage())
+// .vehicleStatus(1)
+// .chargingStatus(1)
+// .operatingStatus(1)
+// .socStatus(1)
+// .chargingEnergyStorageStatus(1)
+// .driveMotorStatus(1)
+// .positionStatus(1)
+// .easStatus(1)
+// .ptcStatus(1)
+// .epsStatus(1)
+// .absStatus(1)
+// .mcuStatus(1)
+// .heatingStatus(1)
+// .batteryStatus(1)
+// .batteryInsulationStatus(1)
+// .dcdcStatus(1)
+// .chgStatus(1)
+// .build();
+// }
+//
+// /**
+// * 模拟基础项
+// */
+// public void imitateBase(){
+// // 总电压
+// this.voltage = genValue(110, 750);
+// // 总电流
+// this.current = genValue(3, 50);
+// // 绝缘电阻
+// this.resistance = genValue(0,30000);
+// // 加速踏板行程值
+// this.accelerationPedal = genValue(0, 10);
+// // 制动踏板行程值
+// this.brakePedal = genValue(0, 10);
+// }
+//
+//
+// /**
+// * 模拟电机数据
+// */
+// public void imitateMotor(){
+// // 电机控制器温度
+// this.motorControllerTemperature = genValue(0, 100);
+// // 电机转速
+// this.motorSpeed = genValue(0, 99999);
+// // 电机转矩
+// this.motorTorque = genValue(0, 1000);
+// // 电机温度
+// this.motorTemperature = genValue(0, 150);
+// // 电机电压
+// this.motorVoltage = genValue(110, 300);
+// // 电机电流
+// this.motorCurrent = genValue(0, 15000);
+// }
+//
+// /**
+// * 模拟电池包数据
+// */
+// public void imitateBatteryPack(){
+// // 当前状态允许的最大反馈功率
+// this.maximumFeedbackPower = genValue(0, 100);
+// // 当前状态允许最大放电功率
+// this.maximumDischargePower = genValue(0, 100);
+// // BMS自检计数器
+// this.selfCheckCounter = genValue(0, 15);
+// // 动力电池充放电电流
+// this.totalBatteryCurrent = genValue(0, 15);
+// // 动力电池负载端总电压V3
+// this.totalBatteryVoltage = genValue(220, 750);
+// // 单体电池最高电压
+// this.singleBatteryMaxVoltage = genValue(3, 5);
+// // 单体电池最低电压
+// this.singleBatteryMinVoltage = genValue(3, 5);
+// // 单体电池最高温度
+// this.singleBatteryMaxTemperature = genValue(0, 100);
+// // 单体电池最低温度
+// this.singleBatteryMinTemperature = genValue(0, 100);
+// // 动力电池可用容量
+// this.availableBatteryCapacity = genValue(0,100 );
+// }
+// /**
+// 车辆状态
+// vehicleStatus;
+// 充电状态
+// chargingStatus;
+// 运行状态
+// operatingStatus;
+// SOC
+// socStatus;
+// 可充电储能装置工作状态
+// chargingEnergyStorageStatus;
+// 驱动电机状态
+// driveMotorStatus;
+// 定位是否有效
+// positionStatus;
+// */
+//
+// /**
+// EAS(汽车防盗系统)状态
+// easStatus;
+// PTC(电动加热器)状态
+// ptcStatus;
+// EPS(电动助力系统)状态
+// epsStatus;
+// ABS(防抱死)状态
+// absStatus;
+// MCU(电机/逆变器)状态
+// mcuStatus;
+// */
+//
+// /**
+// 动力电池加热状态
+// heatingStatus;
+// 动力电池当前状态
+// batteryStatus;
+// 动力电池保温状态
+// batteryInsulationStatus;
+// DCDC(电力交换系统)状态
+// dcdcStatus;
+// CHG(充电机)状态
+// chgStatus;
+// */
+//}
diff --git a/src/main/java/com/mobai/rabbitMq/MessageHandler.java b/src/main/java/com/mobai/rabbitMq/MessageHandler.java
index 669b1d4..db4b71b 100644
--- a/src/main/java/com/mobai/rabbitMq/MessageHandler.java
+++ b/src/main/java/com/mobai/rabbitMq/MessageHandler.java
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Component;
* 消费者:消息处理器
* @ClassName MessageHandler
* @Description 描述
- * @Author SaiSai.Liu
+ * @Author Mobai
* @Date 2024/5/31 14:37
*/
@Log4j2
diff --git a/src/main/java/com/mobai/remote/MyClient.java b/src/main/java/com/mobai/remote/MyClient.java
new file mode 100644
index 0000000..2371d8c
--- /dev/null
+++ b/src/main/java/com/mobai/remote/MyClient.java
@@ -0,0 +1,16 @@
+package com.mobai.remote;
+
+import com.dtflys.forest.annotation.Request;
+import com.mobai.domian.MqttServerModel;
+import com.mobai.domian.Result;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public interface MyClient {
+
+ @Request("http://127.0.0.1:8081/fluxmq/getIps/")
+ Result> getIps();
+
+}
diff --git a/src/main/java/com/mobai/util/CalculateCheckDigit.java b/src/main/java/com/mobai/util/CalculateCheckDigit.java
new file mode 100644
index 0000000..39b860e
--- /dev/null
+++ b/src/main/java/com/mobai/util/CalculateCheckDigit.java
@@ -0,0 +1,44 @@
+package com.mobai.util;
+
+/**
+ * 校验位计算
+ */
+public class CalculateCheckDigit {
+
+ /**
+ * 不去空格
+ * @param sHex
+ * @return
+ */
+ public static String makeCheck(String sHex){
+ return makeCheckSum(sHex.replace(" ", ""));
+ }
+
+ /**
+ * 计算校验位 ,返回十六进制校验位
+ * */
+ private static String makeCheckSum(String data) {
+ int dSum = 0;
+ int length = data.length();
+ int index = 0;
+ // 遍历十六进制,并计算总和
+ while (index < length) {
+ // 截取2位字符
+ String s = data.substring(index, index + 2);
+ // 十六进制转成十进制 , 并计算十进制的总和
+ dSum += Integer.parseInt(s, 16);
+ index = index + 2;
+ }
+
+ // 用256取余,十六进制最大是FF,FF的十进制是255
+ int mod = dSum % 256;
+ // 余数转成十六进制
+ String checkSumHex = Integer.toHexString(mod);
+ length = checkSumHex.length();
+ if (length < 2) {
+ // 校验位不足两位的,在前面补0
+ checkSumHex = "0" + checkSumHex;
+ }
+ return checkSumHex;
+ }
+}
diff --git a/src/main/java/com/mobai/util/ConnectMqtt.java b/src/main/java/com/mobai/util/ConnectMqtt.java
new file mode 100644
index 0000000..c657eff
--- /dev/null
+++ b/src/main/java/com/mobai/util/ConnectMqtt.java
@@ -0,0 +1,43 @@
+package com.mobai.util;
+
+import com.mobai.cofig.MqttFactory;
+import com.mobai.cofig.MqttProperties;
+import com.mobai.domian.MqttCallBackServiceImpl;
+import com.mobai.domian.MqttServerModel;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+
+/**
+ * @ClassName ConnectMqtt
+ * @description mqtt连接工具
+ * @author Mobai
+ * @date 2024/6/5 11:33
+ */
+@Component
+public class ConnectMqtt {
+
+ @Autowired
+ private RedisService redisService;
+
+ public void connectMq(MqttServerModel mqttServerModel) throws ServletException {
+ if (mqttServerModel == null) {
+ throw new ServletException("连接参数不能为空");
+ }
+ MqttProperties mqttProperties = MqttProperties.configBuild(mqttServerModel.getBroker(), mqttServerModel.getTopic());
+// MqttProperties mqttProperties = new MqttProperties();
+// mqttProperties.setBroker("tcp://39.98.69.92:1883");
+// mqttProperties.setTopic("mqtt/test");
+ mqttProperties.setUsername("emqx");
+ mqttProperties.setPassword("public");
+// mqttProperties.setClientid("subscribe_client");
+ int qos = 0;
+ try {
+ MqttClient client = new MqttFactory(new MqttCallBackServiceImpl()).buildOptions(mqttProperties);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/mobai/util/ConversionUtil.java b/src/main/java/com/mobai/util/ConversionUtil.java
new file mode 100644
index 0000000..ff67d2a
--- /dev/null
+++ b/src/main/java/com/mobai/util/ConversionUtil.java
@@ -0,0 +1,68 @@
+package com.mobai.util;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 进制转换工具
+ */
+public class ConversionUtil {
+
+ /**
+ * 字符串转化成为16进制字符串
+ * @param s
+ * @return
+ */
+ public static String strToSixteen(String s) {
+ StringBuilder sb = new StringBuilder();
+ int length = s.length();
+ for (int i = 0; i < length; i++) {
+ int ch = s.charAt(i);
+ String s4 = Integer.toHexString(ch);
+ sb.append(s4 + " ");
+ }
+ return sb.toString();
+ }
+
+ public static void main (String[] args) {
+// String str = "\n" +
+// "Sinus
80No Change0";
+// String strToSixteen = strToSixteen(str);
+// System.out.println(str);
+// System.out.println(str.length());
+// System.out.println(strToSixteen);
+// System.out.println(strToSixteen.replace(" ", "").length());
+
+ String hexStr = "3C3F786D6C2076657273696F6E3D22312E30223F3E0D0A3C6D6F6E69746F72526F6F7420747970653D22706172616D223E3C73796E6368726F6E697A65537970746F6D206576656E743D22302220696E697469616C3D2274727565223E3C416374696F6E5F4543473E3C52687974686D3E53696E75733C2F52687974686D3E3C48523E38303C2F48523E3C454D443E4E6F204368616E67653C2F454D443E3C436F6E647563743E303C2F436F6E647563743E3C2F416374696F6E5F4543473E3C416374696F6E5F4F7361742076616C75653D2239342220697352656C617469766550657263656E743D2266616C7365222F3E3C416374696F6E5F425020697352656C617469766550657263656E743D2266616C7365223E3C536872696E6B2076616C75653D22313230222F3E3C537472657463682076616C75653D223830222F3E3C2F416374696F6E5F42503E3C416374696F6E5F5265737020627265617468547970653D224E6F726D616C222076616C75653D2231342220697352656C617469766550657263656E743D2266616C7365222F3E3C416374696F6E5F6574434F322076616C75653D2233342220697352656C617469766550657263656E743D2266616C7365222F3E3C416374696F6E5F54656D70657261747572652076616C75653D2233352E32222F3E3C416374696F6E5F4356502076616C75653D22362E30222F3E3C416374696F6E5F5041504469612076616C75653D223130222F3E3C416374696F6E5F5041505379732076616C75653D223235222F3E3C416374696F6E5F57502076616C75653D2239222F3E3C2F73796E6368726F6E697A65537970746F6D3E3C2F6D6F6E69746F72526F6F743E0D0A";
+ String hexStringToString = hexStringToString(hexStr);
+ System.out.println(hexStr);
+ System.out.println(hexStr.length());
+ System.out.println(hexStringToString);
+ System.out.println(hexStringToString.length());
+ }
+
+ /**
+ * 16进制转换成为string类型字符串
+ * @param s
+ * @return
+ */
+ public static String hexStringToString(String s) {
+ if (s == null || s.equals("")) {
+ return null;
+ }
+ s = s.replace(" ", "");
+ byte[] baKeyword = new byte[s.length() / 2];
+ for (int i = 0; i < baKeyword.length; i++) {
+ try {
+ baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ try {
+ s = new String(baKeyword, StandardCharsets.UTF_8);
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ return s;
+ }
+}
diff --git a/src/main/java/com/mobai/util/MqttProperties.java b/src/main/java/com/mobai/util/MqttProperties.java
new file mode 100644
index 0000000..9bfc45a
--- /dev/null
+++ b/src/main/java/com/mobai/util/MqttProperties.java
@@ -0,0 +1,46 @@
+package com.mobai.util;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * Mqtt配置类
+ * @author Mobai
+ * @version 1.0
+ * @description Mqtt配置类
+ * @date 2023/11/8
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MqttProperties {
+
+ /**
+ * 节点
+ */
+ private String broker;
+
+ /**
+ * 主题
+ */
+ private String topic;
+
+ /**
+ * 用户名
+ */
+ private String username;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ /**
+ * 节点ID
+ */
+ private String clientId;
+ private int qos = 0;
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 182a86c..4a40315 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -5,3 +5,21 @@ spring:
name: mobai-mq
rabbitmq:
host: 43.142.100.73
+# forest配置
+forest:
+ backend: okhttp3 # 后端HTTP框架(默认为 okhttp3)
+ max-connections: 1000 # 连接池最大连接数(默认为 500)
+ max-route-connections: 500 # 每个路由的最大连接数(默认为 500)
+ max-request-queue-size: 100 # [自v1.5.22版本起可用] 最大请求等待队列大小
+ max-async-thread-size: 300 # [自v1.5.21版本起可用] 最大异步线程数
+ max-async-queue-size: 16 # [自v1.5.22版本起可用] 最大异步线程池队列大小
+ timeout: 30000 # [已不推荐使用] 请求超时时间,单位为毫秒(默认为 3000)
+ connect-timeout: 30000 # 连接超时时间,单位为毫秒(默认为 timeout)
+ read-timeout: 30000 # 数据读取超时时间,单位为毫秒(默认为 timeout)
+ max-retry-count: 0 # 请求失败后重试次数(默认为 0 次不重试)
+ ssl-protocol: TLS # 单向验证的HTTPS的默认TLS协议(默认为 TLS)
+ log-enabled: true # 打开或关闭日志(默认为 true)
+ log-request: true # 打开/关闭Forest请求日志(默认为 true)
+ log-response-status: true # 打开/关闭Forest响应状态日志(默认为 true)
+ log-response-content: true # 打开/关闭Forest响应内容日志(默认为 false)
+ async-mode: platform # [自v1.5.27版本起可用] 异步模式(默认为 platform)