diff --git a/cloud-common/pom.xml b/cloud-common/pom.xml index 39e986c..7155ab4 100644 --- a/cloud-common/pom.xml +++ b/cloud-common/pom.xml @@ -23,6 +23,7 @@ cloud-common-saas cloud-common-swagger cloud-common-cache + cloud-common-kafka cloud-common diff --git a/cloud-modules/cloud-modules-template/pom.xml b/cloud-modules/cloud-modules-template/pom.xml index 8c03c73..2e1c1be 100644 --- a/cloud-modules/cloud-modules-template/pom.xml +++ b/cloud-modules/cloud-modules-template/pom.xml @@ -17,6 +17,10 @@ + + com.muyu + cloud-common-saas + @@ -77,6 +81,12 @@ com.muyu cloud-common-xxl + + com.muyu.server + saas-server + 3.6.3 + compile + diff --git a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/KafkaConsumerConfig.java b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/KafkaConsumerConfig.java similarity index 98% rename from cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/KafkaConsumerConfig.java rename to cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/KafkaConsumerConfig.java index 4ee0d1a..921077f 100644 --- a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/KafkaConsumerConfig.java +++ b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/KafkaConsumerConfig.java @@ -1,4 +1,4 @@ -package com.muyu.server.config; +package com.muyu.template.config; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.Deserializer; diff --git a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/KafkaProviderConfig.java b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/KafkaProviderConfig.java similarity index 98% rename from cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/KafkaProviderConfig.java rename to cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/KafkaProviderConfig.java index e377733..00f5617 100644 --- a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/KafkaProviderConfig.java +++ b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/KafkaProviderConfig.java @@ -1,4 +1,4 @@ -package com.muyu.server.config; +package com.muyu.template.config; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.common.serialization.Serializer; diff --git a/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/MqttConfigure.java b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/MqttConfigure.java new file mode 100644 index 0000000..a41157e --- /dev/null +++ b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/config/MqttConfigure.java @@ -0,0 +1,156 @@ +package com.muyu.template.config; + +import cn.hutool.json.JSONObject; +import com.alibaba.fastjson2.JSON; +import com.muyu.common.domain.MessageTemplateType; +import com.muyu.common.domain.SysCar; +import com.muyu.common.redis.service.RedisService; +import com.muyu.server.service.MessageTemplateTypeService; +import com.muyu.server.service.SysCarService; +import com.muyu.server.service.TemplateService; +import lombok.extern.log4j.Log4j2; +import org.eclipse.paho.client.mqttv3.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * + * @author liuxinyue + * @Package:com.muyu.mqtt.configure + * @Project:cloud-server + * @name:MqttConfigure + * @Date:2024/9/28 16:10 + */ +@Log4j2 +@Component +public class MqttConfigure { + @Autowired + private RedisService redisService; + + @Autowired + private SysCarService sysCarService; + + @Autowired + private MessageTemplateTypeService messageTemplateTypeService; + + @Autowired + private RedisTemplate redisTemplate; + + + @PostConstruct + public void MQTTMonitoring(){ + String topic = "vehicle"; + int qos = 2; + String broker = "tcp://47.101.53.251:1883"; + String clientId = "测试mqtt"; + try { + MqttClient sampleClient = new MqttClient(broker, clientId); + MqttConnectOptions connOpts = new MqttConnectOptions(); + //是否清空session + connOpts.setCleanSession(true); + log.info("Connecting to broker: " + broker); + //连接 + sampleClient.connect(connOpts); + sampleClient.subscribe(topic,qos); + sampleClient.setCallback(new MqttCallback() { + //连接丢失(报错) + @Override + public void connectionLost(Throwable throwable) { + log.error("error:"+throwable.getMessage()); + } + //消息已经接收到 + @Override + public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { + // 将MQTT消息转换为字符串 + String messageContent = new String(mqttMessage.getPayload()); + // 解析JSON字符串 + JSONObject jsonObject = new JSONObject(messageContent); + // 从JSON对象中获取"msg"字段的值 + String msgValue = jsonObject.getStr("msg"); + messageParsing(msgValue); + log.info("接收到的值为:"+msgValue); + } + //交付完成 + @Override + public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { + + } + }); + } catch(MqttException me) { + System.out.println("reason "+me.getReasonCode()); + System.out.println("msg "+me.getMessage()); + System.out.println("loc "+me.getLocalizedMessage()); + System.out.println("cause "+me.getCause()); + System.out.println("excep "+me); + me.printStackTrace(); + } + } + + public JSONObject messageParsing(String templateMessage) { + //给一个JSON对象 + JSONObject jsonObject = new JSONObject(); + //先截取出VIN码 然后根据VIN码查询这个车属于什么类型 + if (templateMessage.length() < 18) { + throw new RuntimeException("The vehicle message is incorrect"); + } + //将报文进行切割 + String[] hexArray = templateMessage.split(" "); + StringBuilder result = new StringBuilder(); + for (String hex : hexArray) { + int decimal = Integer.parseInt(hex, 16); + result.append((char) decimal); + } + //取出VIN码 + String carVin = result.substring(0, 18 - 1); + log.info("carVin码为:" + carVin); + //根据VIN码获取车辆信息 + SysCar carByVin = sysCarService.findCarByVin(carVin); + log.info("车辆信息为:" + carByVin); + //对应车辆所对应的报文模版 + Integer templateId = carByVin.getTemplateId(); + + List templateTypeList; + + //key + String redisKey = "messageTemplateType" + templateId; + + //key存在 + if (redisTemplate.hasKey(redisKey)) { + + List list = redisTemplate.opsForList().range(redisKey, 0, -1); + + templateTypeList = list.stream().map(o -> JSON.parseObject(o.toString(), MessageTemplateType.class)) + .toList(); + + } else { + List templateTypeList1 = messageTemplateTypeService.findTemplateById(templateId); + templateTypeList = templateTypeList1; + templateTypeList.forEach( + templateType -> + redisTemplate.opsForList().rightPush( + redisKey, com.alibaba.fastjson.JSON.toJSONString(templateType) + ) + ); + } + //将模版里面有的配置进行循环 + for (MessageTemplateType messageTemplateType : templateTypeList) { + //开始位置 + Integer startIndex = messageTemplateType.getStartIndex() - 1; + //结束位置 + Integer endIndex = messageTemplateType.getEndIndex(); + //将每个解析后的字段都存入到JSON对象中 + jsonObject.put(messageTemplateType.getMessageField(), result.substring(startIndex, endIndex)); + } + + System.out.println("哈哈哈红红火火恍恍惚惚"); + log.info("解析后的报文是:" + jsonObject); + + return jsonObject; + + } + +} diff --git a/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/TemplateService.java b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/TemplateService.java index f6bc10a..d4e4239 100644 --- a/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/TemplateService.java +++ b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/TemplateService.java @@ -1,5 +1,8 @@ package com.muyu.template.service; +import java.sql.SQLException; +import java.util.concurrent.ExecutionException; + /** * @author liuxinyue * @Package:com.muyu.template.service @@ -7,4 +10,7 @@ package com.muyu.template.service; * @Date:2024/9/30 10:57 */ public interface TemplateService { + + void messageParsing(String templateMessage) ; + } diff --git a/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/impl/TemplateServiceImpl.java b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/impl/TemplateServiceImpl.java index 4e92057..9279118 100644 --- a/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/impl/TemplateServiceImpl.java +++ b/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/service/impl/TemplateServiceImpl.java @@ -1,19 +1,103 @@ package com.muyu.template.service.impl; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; +import com.muyu.common.domain.MessageTemplateType; +import com.muyu.common.domain.SysCar; +import com.muyu.common.redis.service.RedisService; +import com.muyu.server.service.MessageTemplateTypeService; +import com.muyu.server.service.SysCarService; import com.muyu.template.service.TemplateService; +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.sql.SQLException; +import java.util.List; +import java.util.concurrent.ExecutionException; + /** * @author liuxinyue * @Package:com.muyu.template.service.impl * @name:TemplateServiceImpl * @Date:2024/9/30 10:57 */ +@Log4j2 @Service public class TemplateServiceImpl implements TemplateService { + @Autowired + private RedisService redisService; + @Autowired + private SysCarService sysCarService; + @Autowired + private MessageTemplateTypeService messageTemplateTypeService; + @Autowired + private RedisTemplate redisTemplate; + + @Override + public void messageParsing(String templateMessage) { + //给一个JSON对象 + JSONObject jsonObject = new JSONObject(); + //先截取出VIN码 然后根据VIN码查询这个车属于什么类型 + if (templateMessage.length() < 18) { + throw new RuntimeException("The vehicle message is incorrect"); + } + //将报文进行切割 + String[] hexArray = templateMessage.split(" "); + StringBuilder result = new StringBuilder(); + for (String hex : hexArray) { + int decimal = Integer.parseInt(hex, 16); + result.append((char) decimal); + } + //取出VIN码 + String carVin = result.substring(0, 18 - 1); + log.info("carVin码为:" + carVin); + //根据VIN码获取车辆信息 + SysCar carByVin = sysCarService.findCarByVin(carVin); + log.info("车辆信息为:" + carByVin); + //对应车辆所对应的报文模版 + Integer templateId = carByVin.getTemplateId(); + + List templateTypeList; + + //key + String redisKey = "messageTemplateType" + templateId; + + //key存在 + if (redisTemplate.hasKey(redisKey)) { + + List list = redisTemplate.opsForList().range(redisKey, 0, -1); + + templateTypeList = list.stream().map(o -> JSON.parseObject(o.toString(), MessageTemplateType.class)) + .toList(); + + } else { + List templateTypeList1 = messageTemplateTypeService.findTemplateById(templateId); + templateTypeList = templateTypeList1; + templateTypeList.forEach( + templateType -> + redisTemplate.opsForList().rightPush( + redisKey, com.alibaba.fastjson.JSON.toJSONString(templateType) + ) + ); + } + //将模版里面有的配置进行循环 + for (MessageTemplateType messageTemplateType : templateTypeList) { + //开始位置 + Integer startIndex = messageTemplateType.getStartIndex() - 1; + //结束位置 + Integer endIndex = messageTemplateType.getEndIndex(); + //将每个解析后的字段都存入到JSON对象中 + jsonObject.put(messageTemplateType.getMessageField(), result.substring(startIndex, endIndex)); + } + + System.out.println("哈哈哈红红火火恍恍惚惚"); + log.info("解析后的报文是:" + jsonObject); + + } } diff --git a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/MqttConfigure.java b/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/MqttConfigure.java deleted file mode 100644 index 10411a0..0000000 --- a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/config/MqttConfigure.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.muyu.server.config; - -import cn.hutool.json.JSONObject; -import com.muyu.server.service.TemplateService; -import lombok.extern.log4j.Log4j2; -import org.eclipse.paho.client.mqttv3.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * - * @author liuxinyue - * @Package:com.muyu.mqtt.configure - * @Project:cloud-server - * @name:MqttConfigure - * @Date:2024/9/28 16:10 - */ -@Log4j2 -@Component -public class MqttConfigure { - - @Autowired - private TemplateService templateService; - - @PostConstruct - public void MQTTMonitoring(){ - String topic = "vehicle"; - int qos = 2; - String broker = "tcp://47.101.53.251:1883"; - String clientId = "测试mqtt"; - try { - MqttClient sampleClient = new MqttClient(broker, clientId); - MqttConnectOptions connOpts = new MqttConnectOptions(); - //是否清空session - connOpts.setCleanSession(true); - log.info("Connecting to broker: " + broker); - //连接 - sampleClient.connect(connOpts); - sampleClient.subscribe(topic,qos); - sampleClient.setCallback(new MqttCallback() { - //连接丢失(报错) - @Override - public void connectionLost(Throwable throwable) { - log.error("error:"+throwable.getMessage()); - } - //消息已经接收到 - @Override - public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { - // 将MQTT消息转换为字符串 - String messageContent = new String(mqttMessage.getPayload()); - // 解析JSON字符串 - JSONObject jsonObject = new JSONObject(messageContent); - // 从JSON对象中获取"msg"字段的值 - String msgValue = jsonObject.getStr("msg"); - templateService.messageParsing(msgValue); - log.info("接收到的值为:"+msgValue); - } - //交付完成 - @Override - public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { - - } - }); - } catch(MqttException me) { - System.out.println("reason "+me.getReasonCode()); - System.out.println("msg "+me.getMessage()); - System.out.println("loc "+me.getLocalizedMessage()); - System.out.println("cause "+me.getCause()); - System.out.println("excep "+me); - me.printStackTrace(); - } - } -} diff --git a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/controller/TemplateController.java b/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/controller/TemplateController.java index 89dc512..ad8712c 100644 --- a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/controller/TemplateController.java +++ b/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/controller/TemplateController.java @@ -45,17 +45,7 @@ public class TemplateController { } - /** - * 解析报文 - * @param templateMessage - * @return - */ - @PostMapping("/messageParsing") - @Operation(summary = "报文解析",description = "报文解析") - public Result messageParsing(@RequestParam("templateMessage") String templateMessage) throws SQLException, IoTDBConnectionException, ClassNotFoundException, StatementExecutionException, ExecutionException, InterruptedException { - templateService.messageParsing(templateMessage); - return Result.success(); - } + /** * 报文模版添加 diff --git a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/service/TemplateService.java b/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/service/TemplateService.java index ea7189d..3751181 100644 --- a/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/service/TemplateService.java +++ b/cloud-modules/saas/saas-server/src/main/java/com/muyu/server/service/TemplateService.java @@ -19,7 +19,7 @@ import java.util.concurrent.ExecutionException; public interface TemplateService extends IService