diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 03c8480..21deac5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -20,32 +20,52 @@ //依次递增进行数据的解析, public class GenericCombinedFieldResolver { + //前导码失败或者读位置移到空位置 //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, Map storeObjectMap, Map fieldConfigsMap) { Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); - //添加前置处理器 - com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); - List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + Object median = null; + AbstractCombinedFieldProcessor abstractProcessor = null; + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); //frameLength Map combinedProcessorFields = null; while (byteBuf.readableBytes() < frameLength) { - //一直处理 - for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { - combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, - combinedFieldConfigList, - fieldConfigsMap, storeObjectMap); - if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + if (median == null) { + abstractProcessor = new PreLeadCodeProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + if (combinedProcessorFields == null || byteBuf.readableBytes() >= frameLength) { return; } + combinedFieldParam.setPreProcessorResult(median); } - + if (byteBuf.readableBytes() < frameLength) { + if (median instanceof CombinedFieldConfig) { + abstractProcessor = new PreBizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + combinedFieldParam.setPreProcessorResult(median); + } + } + if (byteBuf.readableBytes() < frameLength) { + abstractProcessor = new BizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + } } } + + private CombinedFieldProcessorParam build( ByteBuf byteBuf, Map fieldFixedMap, + Map fieldConfigsMap, Map storeObjectMap) { + return CombinedFieldProcessorParam.builder() + .byteBuf(byteBuf) + .fieldConfigsMap(fieldConfigsMap) + .storeObjectMap(storeObjectMap) + .fieldFixedMap(fieldFixedMap) + .build(); + } + /** * 取出前导码匹配集合 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 03c8480..21deac5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -20,32 +20,52 @@ //依次递增进行数据的解析, public class GenericCombinedFieldResolver { + //前导码失败或者读位置移到空位置 //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, Map storeObjectMap, Map fieldConfigsMap) { Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); - //添加前置处理器 - com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); - List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + Object median = null; + AbstractCombinedFieldProcessor abstractProcessor = null; + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); //frameLength Map combinedProcessorFields = null; while (byteBuf.readableBytes() < frameLength) { - //一直处理 - for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { - combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, - combinedFieldConfigList, - fieldConfigsMap, storeObjectMap); - if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + if (median == null) { + abstractProcessor = new PreLeadCodeProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + if (combinedProcessorFields == null || byteBuf.readableBytes() >= frameLength) { return; } + combinedFieldParam.setPreProcessorResult(median); } - + if (byteBuf.readableBytes() < frameLength) { + if (median instanceof CombinedFieldConfig) { + abstractProcessor = new PreBizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + combinedFieldParam.setPreProcessorResult(median); + } + } + if (byteBuf.readableBytes() < frameLength) { + abstractProcessor = new BizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + } } } + + private CombinedFieldProcessorParam build( ByteBuf byteBuf, Map fieldFixedMap, + Map fieldConfigsMap, Map storeObjectMap) { + return CombinedFieldProcessorParam.builder() + .byteBuf(byteBuf) + .fieldConfigsMap(fieldConfigsMap) + .storeObjectMap(storeObjectMap) + .fieldFixedMap(fieldFixedMap) + .build(); + } + /** * 取出前导码匹配集合 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java new file mode 100644 index 0000000..b4a424c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -0,0 +1,28 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; + +/** + * @author cz + * @date 2023-6-13 + */ +public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + AbstractFieldConfig protocolFieldConfig = (AbstractFieldConfig) combinedFieldParam.getPreProcessorResult(); + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + combinedFieldParam.getStoreObjectMap().put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + combinedFieldParam.getByteBuf().readBytes(protocolFieldConfig.getOffsetLength()); + return null; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 03c8480..21deac5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -20,32 +20,52 @@ //依次递增进行数据的解析, public class GenericCombinedFieldResolver { + //前导码失败或者读位置移到空位置 //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, Map storeObjectMap, Map fieldConfigsMap) { Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); - //添加前置处理器 - com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); - List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + Object median = null; + AbstractCombinedFieldProcessor abstractProcessor = null; + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); //frameLength Map combinedProcessorFields = null; while (byteBuf.readableBytes() < frameLength) { - //一直处理 - for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { - combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, - combinedFieldConfigList, - fieldConfigsMap, storeObjectMap); - if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + if (median == null) { + abstractProcessor = new PreLeadCodeProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + if (combinedProcessorFields == null || byteBuf.readableBytes() >= frameLength) { return; } + combinedFieldParam.setPreProcessorResult(median); } - + if (byteBuf.readableBytes() < frameLength) { + if (median instanceof CombinedFieldConfig) { + abstractProcessor = new PreBizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + combinedFieldParam.setPreProcessorResult(median); + } + } + if (byteBuf.readableBytes() < frameLength) { + abstractProcessor = new BizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + } } } + + private CombinedFieldProcessorParam build( ByteBuf byteBuf, Map fieldFixedMap, + Map fieldConfigsMap, Map storeObjectMap) { + return CombinedFieldProcessorParam.builder() + .byteBuf(byteBuf) + .fieldConfigsMap(fieldConfigsMap) + .storeObjectMap(storeObjectMap) + .fieldFixedMap(fieldFixedMap) + .build(); + } + /** * 取出前导码匹配集合 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java new file mode 100644 index 0000000..b4a424c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -0,0 +1,28 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; + +/** + * @author cz + * @date 2023-6-13 + */ +public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + AbstractFieldConfig protocolFieldConfig = (AbstractFieldConfig) combinedFieldParam.getPreProcessorResult(); + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + combinedFieldParam.getStoreObjectMap().put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + combinedFieldParam.getByteBuf().readBytes(protocolFieldConfig.getOffsetLength()); + return null; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java new file mode 100644 index 0000000..d749855 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -0,0 +1,46 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import com.casic.missiles.pojo.FieldConfig; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +public class PreBizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + /** + * 把长度计算出来,同时拿到对应指定的字段解析配置 + * + * @param combinedFieldParam + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); + FieldConfig fieldConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + if (lengthConfig == null || fieldConfig == null) { + return null; + } + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + fieldConfig.setOffsetLength(fieldValue); + return fieldConfig; + } + + private FieldConfig getFieldConfigById(Long fieldId, Map fieldConfigsMap) { + if (ObjectUtils.isNotEmpty(fieldId)) { + FieldConfig fieldConfig = fieldConfigsMap.get(fieldId); + return fieldConfig; + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 03c8480..21deac5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -20,32 +20,52 @@ //依次递增进行数据的解析, public class GenericCombinedFieldResolver { + //前导码失败或者读位置移到空位置 //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, Map storeObjectMap, Map fieldConfigsMap) { Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); - //添加前置处理器 - com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); - List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + Object median = null; + AbstractCombinedFieldProcessor abstractProcessor = null; + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); //frameLength Map combinedProcessorFields = null; while (byteBuf.readableBytes() < frameLength) { - //一直处理 - for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { - combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, - combinedFieldConfigList, - fieldConfigsMap, storeObjectMap); - if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + if (median == null) { + abstractProcessor = new PreLeadCodeProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + if (combinedProcessorFields == null || byteBuf.readableBytes() >= frameLength) { return; } + combinedFieldParam.setPreProcessorResult(median); } - + if (byteBuf.readableBytes() < frameLength) { + if (median instanceof CombinedFieldConfig) { + abstractProcessor = new PreBizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + combinedFieldParam.setPreProcessorResult(median); + } + } + if (byteBuf.readableBytes() < frameLength) { + abstractProcessor = new BizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + } } } + + private CombinedFieldProcessorParam build( ByteBuf byteBuf, Map fieldFixedMap, + Map fieldConfigsMap, Map storeObjectMap) { + return CombinedFieldProcessorParam.builder() + .byteBuf(byteBuf) + .fieldConfigsMap(fieldConfigsMap) + .storeObjectMap(storeObjectMap) + .fieldFixedMap(fieldFixedMap) + .build(); + } + /** * 取出前导码匹配集合 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java new file mode 100644 index 0000000..b4a424c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -0,0 +1,28 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; + +/** + * @author cz + * @date 2023-6-13 + */ +public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + AbstractFieldConfig protocolFieldConfig = (AbstractFieldConfig) combinedFieldParam.getPreProcessorResult(); + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + combinedFieldParam.getStoreObjectMap().put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + combinedFieldParam.getByteBuf().readBytes(protocolFieldConfig.getOffsetLength()); + return null; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java new file mode 100644 index 0000000..d749855 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -0,0 +1,46 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import com.casic.missiles.pojo.FieldConfig; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +public class PreBizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + /** + * 把长度计算出来,同时拿到对应指定的字段解析配置 + * + * @param combinedFieldParam + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); + FieldConfig fieldConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + if (lengthConfig == null || fieldConfig == null) { + return null; + } + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + fieldConfig.setOffsetLength(fieldValue); + return fieldConfig; + } + + private FieldConfig getFieldConfigById(Long fieldId, Map fieldConfigsMap) { + if (ObjectUtils.isNotEmpty(fieldId)) { + FieldConfig fieldConfig = fieldConfigsMap.get(fieldId); + return fieldConfig; + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java new file mode 100644 index 0000000..df0e676 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.casic.missiles.parser.matcher.LeadingCodeMatcher; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +/** + * @author cz + * @date 2023-6-13 + */ +public class PreLeadCodeProcessor implements AbstractCombinedFieldProcessor { + + /** + * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 + * + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), + combinedFieldParam.getByteBuf()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length()); + return combinedFieldConfig; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 03c8480..21deac5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -20,32 +20,52 @@ //依次递增进行数据的解析, public class GenericCombinedFieldResolver { + //前导码失败或者读位置移到空位置 //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, Map storeObjectMap, Map fieldConfigsMap) { Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); - //添加前置处理器 - com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); - List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + Object median = null; + AbstractCombinedFieldProcessor abstractProcessor = null; + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); //frameLength Map combinedProcessorFields = null; while (byteBuf.readableBytes() < frameLength) { - //一直处理 - for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { - combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, - combinedFieldConfigList, - fieldConfigsMap, storeObjectMap); - if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + if (median == null) { + abstractProcessor = new PreLeadCodeProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + if (combinedProcessorFields == null || byteBuf.readableBytes() >= frameLength) { return; } + combinedFieldParam.setPreProcessorResult(median); } - + if (byteBuf.readableBytes() < frameLength) { + if (median instanceof CombinedFieldConfig) { + abstractProcessor = new PreBizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + combinedFieldParam.setPreProcessorResult(median); + } + } + if (byteBuf.readableBytes() < frameLength) { + abstractProcessor = new BizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + } } } + + private CombinedFieldProcessorParam build( ByteBuf byteBuf, Map fieldFixedMap, + Map fieldConfigsMap, Map storeObjectMap) { + return CombinedFieldProcessorParam.builder() + .byteBuf(byteBuf) + .fieldConfigsMap(fieldConfigsMap) + .storeObjectMap(storeObjectMap) + .fieldFixedMap(fieldFixedMap) + .build(); + } + /** * 取出前导码匹配集合 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java new file mode 100644 index 0000000..b4a424c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -0,0 +1,28 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; + +/** + * @author cz + * @date 2023-6-13 + */ +public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + AbstractFieldConfig protocolFieldConfig = (AbstractFieldConfig) combinedFieldParam.getPreProcessorResult(); + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + combinedFieldParam.getStoreObjectMap().put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + combinedFieldParam.getByteBuf().readBytes(protocolFieldConfig.getOffsetLength()); + return null; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java new file mode 100644 index 0000000..d749855 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -0,0 +1,46 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import com.casic.missiles.pojo.FieldConfig; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +public class PreBizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + /** + * 把长度计算出来,同时拿到对应指定的字段解析配置 + * + * @param combinedFieldParam + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); + FieldConfig fieldConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + if (lengthConfig == null || fieldConfig == null) { + return null; + } + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + fieldConfig.setOffsetLength(fieldValue); + return fieldConfig; + } + + private FieldConfig getFieldConfigById(Long fieldId, Map fieldConfigsMap) { + if (ObjectUtils.isNotEmpty(fieldId)) { + FieldConfig fieldConfig = fieldConfigsMap.get(fieldId); + return fieldConfig; + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java new file mode 100644 index 0000000..df0e676 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.casic.missiles.parser.matcher.LeadingCodeMatcher; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +/** + * @author cz + * @date 2023-6-13 + */ +public class PreLeadCodeProcessor implements AbstractCombinedFieldProcessor { + + /** + * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 + * + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), + combinedFieldParam.getByteBuf()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length()); + return combinedFieldConfig; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java new file mode 100644 index 0000000..35819d5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -0,0 +1,37 @@ +package com.casic.missiles.pojo; + +import io.netty.buffer.ByteBuf; +import lombok.Builder; +import lombok.Data; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +@Data +@Builder +public class CombinedFieldProcessorParam { + /** + * 前一个流程结果 + */ + private Object preProcessorResult; + /** + * + */ + private ByteBuf byteBuf; + /** + * 前导码映射集合 + */ + private Map fieldFixedMap; + /** + * 解析字段映射集合 + */ + private Map fieldConfigsMap; + /** + * 解析字段储存map + */ + private Map storeObjectMap; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 03c8480..21deac5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -20,32 +20,52 @@ //依次递增进行数据的解析, public class GenericCombinedFieldResolver { + //前导码失败或者读位置移到空位置 //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, Map storeObjectMap, Map fieldConfigsMap) { Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); - //添加前置处理器 - com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); - List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + Object median = null; + AbstractCombinedFieldProcessor abstractProcessor = null; + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); //frameLength Map combinedProcessorFields = null; while (byteBuf.readableBytes() < frameLength) { - //一直处理 - for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { - combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, - combinedFieldConfigList, - fieldConfigsMap, storeObjectMap); - if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + if (median == null) { + abstractProcessor = new PreLeadCodeProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + if (combinedProcessorFields == null || byteBuf.readableBytes() >= frameLength) { return; } + combinedFieldParam.setPreProcessorResult(median); } - + if (byteBuf.readableBytes() < frameLength) { + if (median instanceof CombinedFieldConfig) { + abstractProcessor = new PreBizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + combinedFieldParam.setPreProcessorResult(median); + } + } + if (byteBuf.readableBytes() < frameLength) { + abstractProcessor = new BizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + } } } + + private CombinedFieldProcessorParam build( ByteBuf byteBuf, Map fieldFixedMap, + Map fieldConfigsMap, Map storeObjectMap) { + return CombinedFieldProcessorParam.builder() + .byteBuf(byteBuf) + .fieldConfigsMap(fieldConfigsMap) + .storeObjectMap(storeObjectMap) + .fieldFixedMap(fieldFixedMap) + .build(); + } + /** * 取出前导码匹配集合 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java new file mode 100644 index 0000000..b4a424c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -0,0 +1,28 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; + +/** + * @author cz + * @date 2023-6-13 + */ +public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + AbstractFieldConfig protocolFieldConfig = (AbstractFieldConfig) combinedFieldParam.getPreProcessorResult(); + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + combinedFieldParam.getStoreObjectMap().put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + combinedFieldParam.getByteBuf().readBytes(protocolFieldConfig.getOffsetLength()); + return null; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java new file mode 100644 index 0000000..d749855 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -0,0 +1,46 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import com.casic.missiles.pojo.FieldConfig; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +public class PreBizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + /** + * 把长度计算出来,同时拿到对应指定的字段解析配置 + * + * @param combinedFieldParam + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); + FieldConfig fieldConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + if (lengthConfig == null || fieldConfig == null) { + return null; + } + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + fieldConfig.setOffsetLength(fieldValue); + return fieldConfig; + } + + private FieldConfig getFieldConfigById(Long fieldId, Map fieldConfigsMap) { + if (ObjectUtils.isNotEmpty(fieldId)) { + FieldConfig fieldConfig = fieldConfigsMap.get(fieldId); + return fieldConfig; + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java new file mode 100644 index 0000000..df0e676 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.casic.missiles.parser.matcher.LeadingCodeMatcher; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +/** + * @author cz + * @date 2023-6-13 + */ +public class PreLeadCodeProcessor implements AbstractCombinedFieldProcessor { + + /** + * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 + * + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), + combinedFieldParam.getByteBuf()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length()); + return combinedFieldConfig; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java new file mode 100644 index 0000000..35819d5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -0,0 +1,37 @@ +package com.casic.missiles.pojo; + +import io.netty.buffer.ByteBuf; +import lombok.Builder; +import lombok.Data; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +@Data +@Builder +public class CombinedFieldProcessorParam { + /** + * 前一个流程结果 + */ + private Object preProcessorResult; + /** + * + */ + private ByteBuf byteBuf; + /** + * 前导码映射集合 + */ + private Map fieldFixedMap; + /** + * 解析字段映射集合 + */ + private Map fieldConfigsMap; + /** + * 解析字段储存map + */ + private Map storeObjectMap; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java index 68846af..f151913 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java @@ -11,5 +11,5 @@ private String ruletypeId; private String contents; private String dynamicContent; - private Map ruleDictMap; +// private Map ruleDictMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java deleted file mode 100644 index 4cda9e3..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldRuleEngineMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleEvaluator; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FieldRuleEngineMapper extends BaseMapper { -} 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 af3172c..6212b00 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 @@ -6,11 +6,10 @@ import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.parser.provider.RuleConfigProvider; import com.casic.missiles.pojo.*; -import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.RequiredArgsConstructor; @@ -38,15 +37,14 @@ // 2、存在该协议,经过帧结构判断选定帧协议,进行数据报文的解析 @Override public Boolean doParseProtocol(ByteBuf byteBuf) { - String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); + ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 - if (preCodeConfigs.size() == 0) { - return rematch(byteBuf, protocolContent); + if (protocolConfig == null) { + return rematch(byteBuf); } - //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 - ProtocolConfig protocolConfig = preCodeConfigs.get(0); + + //暂时先取第一个, 减少类的创建销毁与构建 AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 @@ -74,9 +72,10 @@ ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); //以下进行业务的规则解析,同时选定流程实例 AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); - DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); + ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 @@ -91,11 +90,12 @@ /** * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 */ - private Boolean rematch(ByteBuf byteBuf, String protocolContent) { + private Boolean rematch(ByteBuf byteBuf) { + String oldDataContent =ByteBufUtil.hexDump(byteBuf); //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 - if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { + if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { //递归执行 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java index 6e36147..60f35d7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -2,7 +2,7 @@ import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; -import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProcessorInstanceProvider; import com.casic.missiles.parser.provider.FieldConfigProvider; import com.casic.missiles.parser.provider.FieldRuleConfigProvider; @@ -26,14 +26,14 @@ /** * 处理实例流程 */ - private final DatagramEventProvider datagramEventProvider; + private final ProcessorInstanceProvider datagramEventProvider; public AbstractRuleConfigFactory(Long ruleId) { this.fieldConfigProvider = new FieldConfigProvider(ruleId); this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); - this.datagramEventProvider = new DatagramEventProvider(ruleId); + this.datagramEventProvider = new ProcessorInstanceProvider(ruleId); } public FieldConfigProvider getFieldConfigProvider() { @@ -48,7 +48,7 @@ return fieldRuleConfigProvider; } - public DatagramEventProvider getDatagramEventProvider() { + public ProcessorInstanceProvider getDatagramEventProvider() { return datagramEventProvider; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java deleted file mode 100644 index bfed6a5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/ProcessorInstanceSelector.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.casic.missiles.pojo.DatagramEventConfig; - -public interface ProcessorInstanceSelector { - - DatagramEventConfig getProcessorInstance(String protocolId); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java deleted file mode 100644 index 6a5777e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.parser.instance.impl; - -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.SpringContextUtil; - -import java.util.List; -import java.util.Optional; - -/** - * @author cz - * - */ -public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - - private static List datagramEventConfigs; - - static { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); - } - - @Override - public DatagramEventConfig getProcessorInstance(String protocolId) { - Optional optionalSelectInstance = datagramEventConfigs.stream() - .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); - return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 8ebea78..5af9639 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,34 +1,61 @@ package com.casic.missiles.parser.matcher; import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Set; public class LeadingCodeMatcher { - //** 1、首字母匹配前导码, + //** 帧结构前导码匹配 + // 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public static List matchFrameLeadingCode(String protocolContent){ - List initialConfigs = initialMatch(protocolContent); - List preCodeConfigs = initialConfigs.stream() - .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) - .collect(Collectors.toList()); - return preCodeConfigs; + public static ProtocolConfig matchFrameLeadingCode(ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + List firstMatchConfigs = initialMatch(protocolContent); + for(ProtocolConfig firstMatchConfig:firstMatchConfigs){ + if(doMacthLeadCode(firstMatchConfig.getPreFix().toLowerCase(), protocolContent)){ + return firstMatchConfig; + } + } + return null; + } + + //** 解析字组合前导码匹配 + // 1、解析字前导码长度,根据长度进行匹配 + // 2、采用有限匹配原则,不允许匹配字符包含 + public static CombinedFieldConfig matchFieldLeadingCode(Map fieldFixedMap, ByteBuf byteBuf) { + String protocolContent = ByteBufUtil.hexDump(byteBuf); + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + String key = entry.getKey(); + if (doMacthLeadCode(protocolContent, key)) { + return entry.getValue(); + } + } + //匹配失败 + return null; } //初始化匹配前导码内容 private static List initialMatch(String protocolContent) { String firstFrameChar = protocolContent.charAt(0) + ""; - ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + ProtocolConfigProvider protocolConfigProvider = new ProtocolConfigProvider(firstFrameChar); return protocolConfigProvider.getMatchList(); } - - - - - + /** + * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + */ + private static Boolean doMacthLeadCode(String preFix, String matchContent) { + Integer preFixLength = preFix.length(); + String beMatchContent = matchContent.substring(0, preFixLength - 1); + return beMatchContent.equals(preFix); + } } 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 e915877..50f23fc 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 @@ -41,6 +41,8 @@ return null; } + + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java deleted file mode 100644 index 70eec5e..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.parser.provider; - - -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.registry.DatagramEventRegistry; -import com.casic.missiles.util.ApplicationContextUtil; -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; - -/** - * @author cz - * @date 2023-6-12 - */ -public class DatagramEventProvider { - - private final DatagramEventConfig processorInstance; - - public DatagramEventProvider(Long ruleId) { - DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); - List datagramEventConfigList = - datagramEventRegistry.getDatagramEventList(ruleId); - processorInstance = this.getProcessorInstance(datagramEventConfigList); - } - - public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { - if (showSkip()) { - return null; - } - return datagramEventConfigList.get(0); - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { - String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? - processorInstance.getSafeBean() : - fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); - return clearComplementZero(plain); - } - return ByteBufUtil.hexDump(bizDataContent); - } - - //解密清零操作 - private String clearComplementZero(String plain) { - plain = plain.substring(0, plain.lastIndexOf("00")); - return plain; - } - - //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); -// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - } - - /** - * 是否应该跳过 - * - * @return - */ - private Boolean showSkip() { - return ObjectUtils.isNotEmpty(processorInstance) ? false : true; - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java new file mode 100644 index 0000000..a6a4377 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +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; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProcessorInstanceProvider { + + private final DatagramEventConfig processorInstance; + + public ProcessorInstanceProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java index d3bbd91..4a34972 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -1,15 +1,11 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import io.netty.buffer.ByteBuf; - -import java.util.List; -import java.util.Map; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; // 前导码匹配->长度字段 public interface AbstractCombinedFieldProcessor { - Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, - Map fieldConfigsMap, Map storeObjectMap); + + Object invoke(CombinedFieldProcessorParam combinedFieldParam); + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 03c8480..21deac5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.resolver.combined; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; +import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -20,32 +20,52 @@ //依次递增进行数据的解析, public class GenericCombinedFieldResolver { + //前导码失败或者读位置移到空位置 //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, Map storeObjectMap, Map fieldConfigsMap) { Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); - //添加前置处理器 - com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); - List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + Object median = null; + AbstractCombinedFieldProcessor abstractProcessor = null; + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); //frameLength Map combinedProcessorFields = null; while (byteBuf.readableBytes() < frameLength) { - //一直处理 - for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { - combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, - combinedFieldConfigList, - fieldConfigsMap, storeObjectMap); - if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + if (median == null) { + abstractProcessor = new PreLeadCodeProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + if (combinedProcessorFields == null || byteBuf.readableBytes() >= frameLength) { return; } + combinedFieldParam.setPreProcessorResult(median); } - + if (byteBuf.readableBytes() < frameLength) { + if (median instanceof CombinedFieldConfig) { + abstractProcessor = new PreBizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + combinedFieldParam.setPreProcessorResult(median); + } + } + if (byteBuf.readableBytes() < frameLength) { + abstractProcessor = new BizFieldParseProcessor(); + median = abstractProcessor.invoke(combinedFieldParam); + } } } + + private CombinedFieldProcessorParam build( ByteBuf byteBuf, Map fieldFixedMap, + Map fieldConfigsMap, Map storeObjectMap) { + return CombinedFieldProcessorParam.builder() + .byteBuf(byteBuf) + .fieldConfigsMap(fieldConfigsMap) + .storeObjectMap(storeObjectMap) + .fieldFixedMap(fieldFixedMap) + .build(); + } + /** * 取出前导码匹配集合 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java new file mode 100644 index 0000000..b4a424c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -0,0 +1,28 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; + +/** + * @author cz + * @date 2023-6-13 + */ +public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + AbstractFieldConfig protocolFieldConfig = (AbstractFieldConfig) combinedFieldParam.getPreProcessorResult(); + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + combinedFieldParam.getStoreObjectMap().put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + combinedFieldParam.getByteBuf().readBytes(protocolFieldConfig.getOffsetLength()); + return null; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java new file mode 100644 index 0000000..d749855 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -0,0 +1,46 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import com.casic.missiles.pojo.FieldConfig; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +public class PreBizFieldParseProcessor implements AbstractCombinedFieldProcessor { + + /** + * 把长度计算出来,同时拿到对应指定的字段解析配置 + * + * @param combinedFieldParam + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = (CombinedFieldConfig) combinedFieldParam.getPreProcessorResult(); + FieldConfig fieldConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getCombinedFieldId(), combinedFieldParam.getFieldConfigsMap()); + if (lengthConfig == null || fieldConfig == null) { + return null; + } + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + fieldConfig.setOffsetLength(fieldValue); + return fieldConfig; + } + + private FieldConfig getFieldConfigById(Long fieldId, Map fieldConfigsMap) { + if (ObjectUtils.isNotEmpty(fieldId)) { + FieldConfig fieldConfig = fieldConfigsMap.get(fieldId); + return fieldConfig; + } else { + return null; + } + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java new file mode 100644 index 0000000..df0e676 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.resolver.combined.impl; + +import com.casic.missiles.parser.matcher.LeadingCodeMatcher; +import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; +/** + * @author cz + * @date 2023-6-13 + */ +public class PreLeadCodeProcessor implements AbstractCombinedFieldProcessor { + + /** + * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 + * + * @return + */ + @Override + public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), + combinedFieldParam.getByteBuf()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length()); + return combinedFieldConfig; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java new file mode 100644 index 0000000..35819d5 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -0,0 +1,37 @@ +package com.casic.missiles.pojo; + +import io.netty.buffer.ByteBuf; +import lombok.Builder; +import lombok.Data; + +import java.util.Map; + +/** + * @author cz + * @date 2023-6-13 + */ +@Data +@Builder +public class CombinedFieldProcessorParam { + /** + * 前一个流程结果 + */ + private Object preProcessorResult; + /** + * + */ + private ByteBuf byteBuf; + /** + * 前导码映射集合 + */ + private Map fieldFixedMap; + /** + * 解析字段映射集合 + */ + private Map fieldConfigsMap; + /** + * 解析字段储存map + */ + private Map storeObjectMap; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java index 68846af..f151913 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/NodeDecoratorParm.java @@ -11,5 +11,5 @@ private String ruletypeId; private String contents; private String dynamicContent; - private Map ruleDictMap; +// private Map ruleDictMap; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java index 4f4de6a..8df2f3e 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -32,7 +32,7 @@ /** * 字段动态的id */ - private String combinedFieldIds; + private Long combinedFieldId; private Date lastTime;