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)