diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java new file mode 100644 index 0000000..708df5d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + + +import com.casic.missiles.pojo.RuleEventConfig; + +import java.util.List; + +public interface RuleEventRegistry { + + List getDatagramEventList(); + +} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java new file mode 100644 index 0000000..708df5d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + + +import com.casic.missiles.pojo.RuleEventConfig; + +import java.util.List; + +public interface RuleEventRegistry { + + List getDatagramEventList(); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java deleted file mode 100644 index 28a6186..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.SubscribeConfig; - -import java.util.List; - -@Deprecated -public interface SubscribeRegistry { - - - List getSubscribeRegistry(Long ruleId); - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java new file mode 100644 index 0000000..708df5d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + + +import com.casic.missiles.pojo.RuleEventConfig; + +import java.util.List; + +public interface RuleEventRegistry { + + List getDatagramEventList(); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java deleted file mode 100644 index 28a6186..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.SubscribeConfig; - -import java.util.List; - -@Deprecated -public interface SubscribeRegistry { - - - List getSubscribeRegistry(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java deleted file mode 100644 index fdca97d..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.CommandEventMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.registry.CommandEventRegistry; -import org.springframework.cache.annotation.Cacheable; - -import java.util.List; -import java.util.Optional; - -@DS("sensorhub") -@Deprecated -public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { - - @Override - @Cacheable(value = "combinedFieldConfigCache", key = "'commandEvent'+#protocolId+#sceneName", unless = "#result == null") - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = this.baseMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java new file mode 100644 index 0000000..708df5d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + + +import com.casic.missiles.pojo.RuleEventConfig; + +import java.util.List; + +public interface RuleEventRegistry { + + List getDatagramEventList(); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java deleted file mode 100644 index 28a6186..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.SubscribeConfig; - -import java.util.List; - -@Deprecated -public interface SubscribeRegistry { - - - List getSubscribeRegistry(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java deleted file mode 100644 index fdca97d..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.CommandEventMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.registry.CommandEventRegistry; -import org.springframework.cache.annotation.Cacheable; - -import java.util.List; -import java.util.Optional; - -@DS("sensorhub") -@Deprecated -public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { - - @Override - @Cacheable(value = "combinedFieldConfigCache", key = "'commandEvent'+#protocolId+#sceneName", unless = "#result == null") - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = this.baseMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java deleted file mode 100644 index 0d1ce16..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.DatagramEventConfigMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@DS("sensorhub") -public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { - - @Override - @Cacheable(value = "datagramEventConfigCache", key = "'datagram'+#ruleId", unless = "#result == null") - public List getDatagramEventList(Long ruleId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", ruleId); - List fieldConfigList = this.baseMapper.selectList(queryWrapper); - return fieldConfigList; - } - - -} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java new file mode 100644 index 0000000..708df5d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + + +import com.casic.missiles.pojo.RuleEventConfig; + +import java.util.List; + +public interface RuleEventRegistry { + + List getDatagramEventList(); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java deleted file mode 100644 index 28a6186..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.SubscribeConfig; - -import java.util.List; - -@Deprecated -public interface SubscribeRegistry { - - - List getSubscribeRegistry(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java deleted file mode 100644 index fdca97d..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.CommandEventMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.registry.CommandEventRegistry; -import org.springframework.cache.annotation.Cacheable; - -import java.util.List; -import java.util.Optional; - -@DS("sensorhub") -@Deprecated -public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { - - @Override - @Cacheable(value = "combinedFieldConfigCache", key = "'commandEvent'+#protocolId+#sceneName", unless = "#result == null") - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = this.baseMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java deleted file mode 100644 index 0d1ce16..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.DatagramEventConfigMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@DS("sensorhub") -public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { - - @Override - @Cacheable(value = "datagramEventConfigCache", key = "'datagram'+#ruleId", unless = "#result == null") - public List getDatagramEventList(Long ruleId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", ruleId); - List fieldConfigList = this.baseMapper.selectList(queryWrapper); - return fieldConfigList; - } - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java index 3b57c64..1b96b1f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -3,6 +3,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; import com.casic.missiles.mapper.RuleConfigMapper; import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.RuleConfigRegistry; @@ -15,7 +16,6 @@ @DS("sensorhub") public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { - @Override @Cacheable(value = "ruleConfigCache", key = "'nextRuleConfig'+#ruleFields", unless = "#result == null") public RuleConfig getNextRuleConfig(String ruleFields) { diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java new file mode 100644 index 0000000..708df5d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + + +import com.casic.missiles.pojo.RuleEventConfig; + +import java.util.List; + +public interface RuleEventRegistry { + + List getDatagramEventList(); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java deleted file mode 100644 index 28a6186..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.SubscribeConfig; - -import java.util.List; - -@Deprecated -public interface SubscribeRegistry { - - - List getSubscribeRegistry(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java deleted file mode 100644 index fdca97d..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.CommandEventMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.registry.CommandEventRegistry; -import org.springframework.cache.annotation.Cacheable; - -import java.util.List; -import java.util.Optional; - -@DS("sensorhub") -@Deprecated -public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { - - @Override - @Cacheable(value = "combinedFieldConfigCache", key = "'commandEvent'+#protocolId+#sceneName", unless = "#result == null") - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = this.baseMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java deleted file mode 100644 index 0d1ce16..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.DatagramEventConfigMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@DS("sensorhub") -public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { - - @Override - @Cacheable(value = "datagramEventConfigCache", key = "'datagram'+#ruleId", unless = "#result == null") - public List getDatagramEventList(Long ruleId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", ruleId); - List fieldConfigList = this.baseMapper.selectList(queryWrapper); - return fieldConfigList; - } - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java index 3b57c64..1b96b1f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -3,6 +3,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; import com.casic.missiles.mapper.RuleConfigMapper; import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.RuleConfigRegistry; @@ -15,7 +16,6 @@ @DS("sensorhub") public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { - @Override @Cacheable(value = "ruleConfigCache", key = "'nextRuleConfig'+#ruleFields", unless = "#result == null") public RuleConfig getNextRuleConfig(String ruleFields) { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleEventRegistryImpl.java new file mode 100644 index 0000000..599147f --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@DS("sensorhub") +public class RuleEventRegistryImpl extends ServiceImpl implements RuleEventRegistry { + + @Override + @Cacheable(value = "ruleEventRegistryImpl", key = "'ruleEvent'", unless = "#result == null") + public List getDatagramEventList() { + List fieldConfigList = this.baseMapper.selectList(null); + return fieldConfigList; + } + + +} diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index 89786d7..487fc70 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -19,7 +19,7 @@ use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://111.198.10.15:11336/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&&useSSL=true username: root password: Casic203 use-ping-method: false diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java index d2e6c79..59f83f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/AepCommandSend.java @@ -43,6 +43,7 @@ public void handleAndReply(Map h2sDataMap) { AepConfig aepConfig = SpringContextUtil.getBean(AepConfig.class); AepDeviceCommandLwmProfileClient client = getAepClient(aepConfig); + //为解析准备需要的参数 List list = new ArrayList<>(); SensorhubDecoder sensorhubDecoder = new SensorhubDecoder(); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index f7b0f43..8277edd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,6 @@ import com.casic.missiles.provider.CombinedFieldConfigProvider; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.FieldConfigProvider; /** * 存放规则相关的的的加载信息 @@ -17,16 +16,11 @@ * 处理组合字节解析的解码器 */ private final CombinedFieldConfigProvider combinedFieldConfigProvider; - /** - * 处理实例流程 - */ - private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); - this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -37,9 +31,4 @@ return combinedFieldConfigProvider; } - public ProcessorInstanceProvider getDatagramEventProvider() { - return datagramEventProvider; - } - - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java index 4b0728a..010f260 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/HexDateFormatFunction.java @@ -16,9 +16,10 @@ */ public class HexDateFormatFunction extends CustomizedFunction { /** + * 解析16进制时间,获取当前字符串的时间片 * - * @param env 自定义的参数 - * @param arg1 函数参数 + * @param env 自定义的参数 + * @param arg1 函数参数 * @return */ @Override @@ -36,6 +37,7 @@ /** * 函数自定义名称 + * * @return */ @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java index e0f987f..b63e414 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/function/StrDateFormatFunction.java @@ -14,6 +14,8 @@ public class StrDateFormatFunction extends CustomizedFunction { /** + * 字符串转byteBuf的阶段 + * * @param env 自定义的参数 * @param arg1 函数参数 * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index b91ed97..8ac88bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.reply.ReplyCommandEnum; -import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -13,9 +10,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; +import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -23,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; /** @@ -64,8 +60,8 @@ try { devcode = (String) parseFixedDataMap.get("devcode"); //2、通过协议工厂匹配,匹配规则,获取规则配置 - RuleConfig ruleConfig = getRuleConfig(protocolFactory, parseFixedDataMap); - if (ObjectUtil.isEmpty(ruleConfig)) { + RuleConfigProvider ruleConfigProvider = getRuleConfig(protocolFactory, parseFixedDataMap); + if (ObjectUtil.isEmpty(ruleConfigProvider.getRuleConfig())) { //打印源数据,设备编号 byteBuf.resetReaderIndex(); log.error("解析匹配失败,匹配帧信息为{}", ByteBufUtil.hexDump(byteBuf)); @@ -74,21 +70,15 @@ //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } - //创建规则相关的工厂,流程实例、字节解析、组合字段解析、字段解析规则等有关业务解析配置 - AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - //3、获取流程实例配置,判断配置是否完整正确 - ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); - DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); - Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { - throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); - }); + //3、创建规则相关的工厂,加载字节解析、组合字段解析、字段解析规则等有关业务解析配置 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfigProvider.getRuleConfig().getId()); //4、处理粘包拆包的主要组合,通过帧结构的进行处理 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; //通过匹配帧结构判断是否获取了完整的数据包,没有则挂起或舍弃 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider, parseFixedDataMap)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap)) != null) { break; } } @@ -100,15 +90,15 @@ //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); //5、业务内容密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + ByteBuf clearZeroPlainBuf = ruleConfigProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); log.debug("解析的明文是----------" + ByteBufUtil.hexDump(clearZeroPlainBuf)); //保存解密后报文信息到内存,ProtocolProcessEventListene协议流程监听器,主要 ProtocolProcessEventListener.setTask(devcode, ByteBufUtil.hexDump(clearZeroPlainBuf), 2); //6、解析tag业务字段 - ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfigProvider.getRuleConfig(), clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //7、构建解析的数据集合 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -121,7 +111,7 @@ //保存解析的业务字段信息到内存 ProtocolProcessEventListener.setTask(devcode, bizDataMap, 3); //9、数据订阅 - datagramEventProvider.subscribeData(bizDataMap); + ruleConfigProvider.subscribeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); //数据发送,异步,异常拦截 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index 54f2ba4..9dba3a0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -10,7 +10,6 @@ import com.casic.missiles.pojo.ProcessEventTask; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.util.ClazzUtil; @@ -57,7 +56,7 @@ /** * 获取规则配置,执行规则匹配 */ - protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { + protected RuleConfigProvider getRuleConfig(AbstractProtocolConfigFactory protocolFactory, Map parseFixedDataMap) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); @@ -73,9 +72,9 @@ //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 - RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); - return ruleConfig; + ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfigProvider.getRuleConfig())); + return ruleConfigProvider; } return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a7a3e28..e3dfc9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,8 +1,7 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import java.util.Map; @@ -23,7 +22,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index 2bca65d..b0cc1d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -4,10 +4,9 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import org.springframework.core.annotation.Order; import org.springframework.util.ObjectUtils; @@ -28,7 +27,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -38,7 +37,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index e764e3a..3db3481 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -8,10 +8,9 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -43,7 +42,7 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -55,21 +54,21 @@ //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { //匹配帧长度 - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束,表示当前帧可以解析 if (unpackFlag == 1) { //帧结构合并判断 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide, parseFixedDataMap); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, ruleConfigProvider, parseFixedDataMap); return intactMessageByte; } else { //表示当前帧不可以解析,需要进行挂起操作 storeHalfPackBuf(protocolFactory, matchByteBuf); } //前一帧没有解析,当前流可以读取,需再次进行匹配 - matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, ruleConfigProvider.getRuleConfig().getSafeFillZeroCoefficient(), protocolFactory); } } return null; @@ -82,14 +81,14 @@ * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider, Map parseFixedDataMap) { + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory,RuleConfigProvider ruleConfigProvider, Map parseFixedDataMap) { //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); //获取挂起的帧并按seq进行排序,*******************这个seq属于业务定制,后续可以酌情修改 List sortList = getHangUpFrame(protocolFactory, parseFixedDataMap, byteBufContent); //对帧结构进行头、内容、尾划分,执行帧合并操作 - FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, datagramEventProvider); + FrameNodeStr frameNodeStr = doMergeMarkFrame(sortList, protocolFactory, ruleConfigProvider); ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(frameNodeStr.getFrameBody(), frameNodeStr.getFrameHeader(), frameNodeStr.getFrameTail()); //增加头 mergeWholeFrameByte.writeBytes(Hex.decode(frameNodeStr.getFrameHeader())); @@ -106,10 +105,9 @@ * * @param sortList * @param protocolFactory - * @param datagramEventProvider * @return */ - private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + private FrameNodeStr doMergeMarkFrame(List sortList, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); String frameTail = "", frameHeader = "", frameBody = ""; //会存在多个帧拼接在一起的的情况,进行合并处理 @@ -123,13 +121,13 @@ frameHeader = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); //首次获取业务数据报文,明文合并,密文合并还存在问题 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody = plainText; frameTail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { //是否需要解密 String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); - String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + String plainText = ruleConfigProvide.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); frameBody += plainText; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 1833728..583775d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -5,11 +5,10 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; @@ -26,7 +25,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide, Map parseFixedDataMap) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, RuleConfigProvider ruleConfigProvide, Map parseFixedDataMap) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index 7023028..797a75c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -1,19 +1,26 @@ package com.casic.missiles.parser.rule; +import cn.hutool.core.lang.Assert; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import com.casic.missiles.util.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class GenericRuleResolver { /** - * 匹配规则 - * + * 匹配规则 + *

* 1、准备前置规则字段集合 * 2、准备固定字段集合 * 3、执行规则匹配 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 54b4e58..133ebca 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -44,7 +44,7 @@ if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + if (!("1".equals(ruleConfigOptional.get().getFinishMatch()))) { Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java index 13ad2ae..58239ea 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/DataSubscribeProvider.java @@ -1,7 +1,5 @@ package com.casic.missiles.parser.sender; -import com.casic.missiles.pojo.SubscribeDetailConfig; - import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index c8a1c15..a33c715 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -5,7 +5,6 @@ import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import com.casic.missiles.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java index 061fb13..9ea3d10 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/KafkaSubscribe.java @@ -1,19 +1,15 @@ package com.casic.missiles.parser.sender.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.autoconfig.KafkaSendResultHandler; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.parser.sender.SenderSupport; import com.casic.missiles.pojo.Message; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 7d013ec..5e35a28 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 2f783fd..ef62df3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.SubscribeDetailConfig; import org.springframework.stereotype.Component; import java.util.List; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java deleted file mode 100644 index a522930..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.casic.missiles.provider; - - -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.config.SensorhubProperties; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.registry.SubscribeRegistry; -import com.casic.missiles.util.SpringContextUtil; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author cz - * @date 2023-6-12 - */ -public class ProcessorInstanceProvider { - - private final DatagramEventConfig processorInstance; - private static Boolean textPlain = false; - - public ProcessorInstanceProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - SubscribeRegistry subscribeRegistry = SpringContextUtil.getBean(SubscribeRegistry.class); - } - - public DatagramEventConfig getProcessorInstance() { - return processorInstance; - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (CollectionUtils.isNotEmpty(datagramEventConfigList)) { - return datagramEventConfigList.get(0); - } - return null; - } - - /** - * 报文解密 - * 1、否有动态bean,没有去设置的bean,有则取之 - * 2、bean不为空,进行解密操作,否则返回原文 - * - * @param bizDataContent - * @param fieldConfigMap - * @return - */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - //如果执行完合并的解密,不需要再次进行解密,直接跳出 - if (textPlain) { - return bizDataContent; - } - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - //根据长度进行截取0的判断 - return clearComplementZero(plain, bizFieldLength); - } - return bizDataContent; - } - - public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { - textPlain = true; - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - Integer bizFieldLength = fieldLengthSupplier.get(); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - ByteBuf plain = safeStrategy.decryption(bizDataContent); - //根据长度进行截取0的判断 - ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); - return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); - } - return bizDataContent; - } - - - /** - * 报文加密 - *

- * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 - */ - public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - ByteBuf cipherByteBuf = null; - if (!StringUtils.isEmpty(safeName)) { - fillFrameStructZero(replyBytes, processorInstance.getSafeLength()); - //需要加密 - SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); - //加密密文 - cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); - return cipherByteBuf; - } - return cipherByteBuf; - } - - /** - * 解密清零操作 - * - * @param plainBuf - * @return - */ - private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { - Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { - plainLength--; - } - plainBuf = plainBuf.slice(0, ++plainLength); - return plainBuf; - } - - /** - * 加密补零操作 - */ - private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { - safeLength *= 2; - while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { - replyBytes.writeByte(0); - } - return replyBytes; - } - - - /** - * 数据订阅 - */ - public void subscribeData(List> bizDataMap) { - SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); - DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); - subscribeProvider.publishDataSubscribe(bizDataMap); - } - -// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// subscribeConfigs.forEach( -// subscribeConfig -> { -// subscribeConfig.getSubscribeDetailConfigs().forEach( -// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) -// ); -// } -// ); - - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index 0181bf5..4023e2d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.enums.parser.FrameStructEnum; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; import org.apache.commons.lang3.StringUtils; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; @@ -23,6 +25,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -288,7 +291,7 @@ log.debug("业务内容----------" + bizDataStr); //获取缓存 if (StringUtils.isNotEmpty(bizDataStr) && StringUtils.isNotEmpty(headFrame) && StringUtils.isNotEmpty(tail)) { - frameStructMap=new HashMap<>(); + frameStructMap = new HashMap<>(); ByteBuf headFrameByte = ByteBufAllocator.DEFAULT.buffer(); headFrameByte.writeBytes(Hex.decode(headFrame)); frameStructMap.put(BEFORE_BUSINESS_CONTENT, headFrameByte); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java index 77985f4..22188b1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/RuleConfigProvider.java @@ -1,15 +1,28 @@ package com.casic.missiles.provider; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.config.SensorhubProperties; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.registry.RuleEventRegistry; import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author cz @@ -18,20 +31,38 @@ public class RuleConfigProvider { private final List ruleConfigs; + private RuleConfig matchingRuleConfig; + private Boolean textPlain = false; + private Map ruleEventMap; - public List getRuleConfigs() { - return ruleConfigs; + public RuleConfig getRuleConfig() { + return matchingRuleConfig; } public RuleConfig getSendRuleConfig(Integer scene) { Optional optionalRuleConfig = ruleConfigs.stream().filter( ruleConfig -> ruleConfig.getScene() != null && ruleConfig.getScene().equals(scene)).findFirst(); - return optionalRuleConfig.isPresent() ? optionalRuleConfig.get() : null; + if (optionalRuleConfig.isPresent()) { + RuleConfig ruleConfig = optionalRuleConfig.get(); + RuleEventConfig ruleEventConfig = ruleEventMap.get(ruleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + ruleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + ruleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return ruleConfig; + } + return null; } public RuleConfigProvider(Long protocolId) { RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + //获取规则事件字段 + RuleEventRegistry ruleEventRegistry = SpringContextUtil.getBean(RuleEventRegistry.class); + List ruleEventConfigList = ruleEventRegistry.getDatagramEventList(); + ruleEventMap = ruleEventConfigList.stream().collect(Collectors.toMap( + RuleEventConfig::getId, e -> e)); } /** @@ -47,8 +78,112 @@ if (showSkip()) { return null; } - RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); - return ruleConfig; + matchingRuleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + RuleEventConfig ruleEventConfig = ruleEventMap.get(matchingRuleConfig.getRuleEventId()); + Assert.isFalse(Objects.isNull(ruleEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.RULE_EVENT_NULL); + }); + //填充tag业务字段 + matchingRuleConfig.setCombinedFieldIds(ruleEventConfig.getCombinedFieldIds()); + matchingRuleConfig.setDataFieldIds(ruleEventConfig.getDataFieldIds()); + return matchingRuleConfig; + } + + /** + * 报文解密 + * 1、否有动态bean,没有去设置的bean,有则取之 + * 2、bean不为空,进行解密操作,否则返回原文 + * + * @param bizDataContent + * @param fieldConfigMap + * @return + */ + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + //根据长度进行截取0的判断 + return clearComplementZero(plain, bizFieldLength); + } + return bizDataContent; + } + + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = matchingRuleConfig.getSafeBean(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + + + /** + * 报文加密 + *

+ * 如果进行过解密操作,那么回复自动判定密文需要加密并按照同样的加密的方式进行回复 + */ + public ByteBuf buildSafeDatagram(ByteBuf replyBytes, Map fieldConfigMap) { + String safeName = matchingRuleConfig.getSafeBean(); + ByteBuf cipherByteBuf = null; + if (!StringUtils.isEmpty(safeName)) { + fillFrameStructZero(replyBytes, matchingRuleConfig.getSafeFillZeroCoefficient()); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + //加密密文 + cipherByteBuf = safeStrategy.encryption(ByteBufUtil.hexDump(replyBytes)); + return cipherByteBuf; + } + return cipherByteBuf; + } + + + /** + * 数据订阅 + */ + public void subscribeData(List> bizDataMap) { + SensorhubProperties sensorhubProperties = SpringContextUtil.getBean(SensorhubProperties.class); + DataSubscribeProvider subscribeProvider = SpringContextUtil.getBean(sensorhubProperties.getBean()); + subscribeProvider.publishDataSubscribe(bizDataMap); + } + + /** + * 解密清零操作 + * + * @param plainBuf + * @return + */ + private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { + Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { + plainLength--; + } + plainBuf = plainBuf.slice(0, ++plainLength); + return plainBuf; + } + + /** + * 加密补零操作 + */ + private ByteBuf fillFrameStructZero(ByteBuf replyBytes, Integer safeLength) { + safeLength *= 2; + while (ByteBufUtil.hexDump(replyBytes).length() % safeLength != 0) { + replyBytes.writeByte(0); + } + return replyBytes; } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 224437f..8ede8fc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -60,7 +60,7 @@ //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult, fieldRuleConfigMap); //加密分为,补零 加密报文 - replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); + replyBytes = parseResult.getProtocolFactory().getRuleConfigProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //参数准备 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 3a6e047..24223bb 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -13,8 +13,9 @@ COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), - PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"), - RULE_PARSE_FAIL(3006, "规则解析失败"); + RULE_EVENT_NULL(3005, "规则事件配置为空"), + RULE_PARSE_FAIL(3006, "规则解析失败"), + REPLY_FIELD_NULL(3007, "回复组合字段配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 7368988..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -@Deprecated -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java index 042eb3c..6cc22ab 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -1,9 +1,9 @@ package com.casic.missiles.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.RuleEventConfig; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface DatagramEventConfigMapper extends BaseMapper { +public interface DatagramEventConfigMapper extends BaseMapper { } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java deleted file mode 100644 index 623eeb1..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author cz - * - */ -public interface SubscribeConfigMapper extends BaseMapper { - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java deleted file mode 100644 index 0bfe7c9..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/mapper/SubscribeDetailConfigMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -/** - * @author cz - * - */ - -@Mapper -public interface SubscribeDetailConfigMapper extends BaseMapper { - - - - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java deleted file mode 100644 index 5901442..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CommandEventConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@Deprecated -@TableName("command_event_config") -public class CommandEventConfig { - private Long id; - private Long protocolId; - private String scene; - private String commandBean; - private String safeBean; - private String replyContentJson; - private String ownerId; - private Date createTime; - private Date lastTime; - private Integer enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java deleted file mode 100644 index b6d634f..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/DatagramEventConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("datagram_event_config") -public class DatagramEventConfig { - - private Long id; - private String ruleId; - private String eventName; - private String safeFieldId; - private String safeBean; - private Integer safeLength; - - private String dataBuilderBean; - private String subscribeBean; - private String ownerId; - private Date createTime; - private Date lastTime; - private String enabled; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 8f5f59c..59d06c0 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -14,36 +15,65 @@ @Data @TableName("rule_config") public class RuleConfig { + private Long id; - private String protocolId; + + /** + * 协议id + */ + private Long protocolId; + /** + * 规则事件id + */ + private Long ruleEventId; /** * 是否完成规则配置,没有完成, * 则需要根据规则继续匹配 */ - private String isFinishMatch; + private String finishMatch; + + /** + * 规则名称 + */ + private String ruleName; /** * 待匹配解析规则 * {“data_field”:"data_value"} */ private String matchRuleJson; - /** - * 待解析字段ids - */ - private String dataFieldIds; /** - * 待解析组合字段ids + * 加密使用的bean */ - private String combinedFieldIds; + private String safeBean; + /** + * 加密补充零的系数 + */ + private Integer safeFillZeroCoefficient; /** - * 待解析组合字段ids + * 回复场景,目前1、2、3分别代表回复时间戳、确认版本升级、升级包内容 */ private Integer scene; /** - * aviator + * 条件表达式 */ private String conditionExpression; + + /** + * 待解析字段ids + */ + @TableField(exist = false) + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + @TableField(exist = false) + private String combinedFieldIds; + + private Date createTime; private Date lastTime; + private Long createUserId; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java new file mode 100644 index 0000000..2467dcc --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEventConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 规则时间配置表 + * 回复事件:时间戳,确认升级,升级包内容,数据上报 + * 解析事件:三码上报、版本比对、数据包升级、下发配置确认 + * + * @author cz + * @date 2024-5/11 + */ +@Data +@TableName("rule_event_config") +public class RuleEventConfig { + + private Long id; + /** + * 事件名称 + */ + private String eventName; + /** + * 待解析字段ids + */ + private String dataFieldIds; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + private Date createTime; + private Date lastTime; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java deleted file mode 100644 index 45822b4..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author cz - */ -@TableName("subscribe_config") -@Data -@Deprecated -public class SubscribeConfig { - - private Long id; - private String protocolId; - private String ruleId; - private String topic; - private String sendType; - private String remark; - private String ownerId; - private Date createTime; - - @TableField(exist = false) - private List subscribeDetailConfigs; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java deleted file mode 100644 index dc358fb..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/SubscribeDetailConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("subscribe_detail_config") -@Deprecated -public class SubscribeDetailConfig { - - private Long id; - private Long topicId; - private String subscribeType; - private String userName; - private String password; - private String address; - private String appKey; - private String appSecret; - private String remark; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java deleted file mode 100644 index fb97d87..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.CommandEventConfig; - -public interface CommandEventRegistry { - - CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java deleted file mode 100644 index fb34641..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.DatagramEventConfig; - -import java.util.List; - -public interface DatagramEventRegistry{ - - List getDatagramEventList(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java new file mode 100644 index 0000000..708df5d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleEventRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + + +import com.casic.missiles.pojo.RuleEventConfig; + +import java.util.List; + +public interface RuleEventRegistry { + + List getDatagramEventList(); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java deleted file mode 100644 index 28a6186..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/SubscribeRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.registry; - -import com.casic.missiles.pojo.SubscribeConfig; - -import java.util.List; - -@Deprecated -public interface SubscribeRegistry { - - - List getSubscribeRegistry(Long ruleId); - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java deleted file mode 100644 index fdca97d..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.CommandEventMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.registry.CommandEventRegistry; -import org.springframework.cache.annotation.Cacheable; - -import java.util.List; -import java.util.Optional; - -@DS("sensorhub") -@Deprecated -public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { - - @Override - @Cacheable(value = "combinedFieldConfigCache", key = "'commandEvent'+#protocolId+#sceneName", unless = "#result == null") - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = this.baseMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java deleted file mode 100644 index 0d1ce16..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.DatagramEventConfigMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@DS("sensorhub") -public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { - - @Override - @Cacheable(value = "datagramEventConfigCache", key = "'datagram'+#ruleId", unless = "#result == null") - public List getDatagramEventList(Long ruleId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", ruleId); - List fieldConfigList = this.baseMapper.selectList(queryWrapper); - return fieldConfigList; - } - - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java index 3b57c64..1b96b1f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -3,6 +3,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; import com.casic.missiles.mapper.RuleConfigMapper; import com.casic.missiles.pojo.RuleConfig; import com.casic.missiles.registry.RuleConfigRegistry; @@ -15,7 +16,6 @@ @DS("sensorhub") public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { - @Override @Cacheable(value = "ruleConfigCache", key = "'nextRuleConfig'+#ruleFields", unless = "#result == null") public RuleConfig getNextRuleConfig(String ruleFields) { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleEventRegistryImpl.java new file mode 100644 index 0000000..599147f --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.RuleEventConfig; +import com.casic.missiles.registry.RuleEventRegistry; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@DS("sensorhub") +public class RuleEventRegistryImpl extends ServiceImpl implements RuleEventRegistry { + + @Override + @Cacheable(value = "ruleEventRegistryImpl", key = "'ruleEvent'", unless = "#result == null") + public List getDatagramEventList() { + List fieldConfigList = this.baseMapper.selectList(null); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/SubscribeRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/SubscribeRegistryImpl.java deleted file mode 100644 index e26c8a2..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/SubscribeRegistryImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.casic.missiles.registry.impl; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.mapper.SubscribeConfigMapper; -import com.casic.missiles.mapper.SubscribeDetailConfigMapper; -import com.casic.missiles.pojo.SubscribeConfig; -import com.casic.missiles.pojo.SubscribeDetailConfig; -import com.casic.missiles.registry.SubscribeRegistry; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -@Service -@DS("sensorhub") -@Deprecated -@RequiredArgsConstructor -public class SubscribeRegistryImpl extends ServiceImpl implements SubscribeRegistry { - - private final SubscribeDetailConfigMapper subscribeDetailConfigMapper; - - /** - * 获取订阅的配置信息 - * - * @param ruleId - * @return - */ - @Override - public List getSubscribeRegistry(Long ruleId) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("rule_id", ruleId); - List subscribeDetailConfigs = this.baseMapper.selectList(queryWrapper); - setSubscribeDetailConfigs(subscribeDetailConfigs); - return subscribeDetailConfigs; - } - - /** - * 设置订阅配置明细信息 - * - * @param subscribeDetailConfigs - */ - private void setSubscribeDetailConfigs(List subscribeDetailConfigs) { - if (CollectionUtils.isEmpty(subscribeDetailConfigs)) { - return; - } - List subscribeDetailConfigList = this.subscribeDetailConfigMapper.selectList(null); - Map> subscribeDetailConfigMap = subscribeDetailConfigList.stream() - .collect(Collectors.groupingBy(SubscribeDetailConfig::getTopicId)); - subscribeDetailConfigs.forEach( - subscribeConfig -> subscribeConfig.setSubscribeDetailConfigs(subscribeDetailConfigMap.get(subscribeConfig.getProtocolId())) - ); - } - - -}