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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 626fed3..b4499c5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; @@ -15,7 +16,7 @@ import org.springframework.util.ObjectUtils; /** - * 结尾标志获取完整的数据报文 + * 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) @@ -23,7 +24,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 626fed3..b4499c5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; @@ -15,7 +16,7 @@ import org.springframework.util.ObjectUtils; /** - * 结尾标志获取完整的数据报文 + * 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) @@ -23,7 +24,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index dfeb85d..905c728 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -18,16 +18,13 @@ /** * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() - - .maxSize(1000) - - .expiration(30, TimeUnit.SECONDS) - + public final static ExpiringMap> storeMap = ExpiringMap.builder() + .maxSize(10000) + //过期时间60分钟 + .expiration(60, TimeUnit.MINUTES) + //更新失效 .expirationPolicy(ExpirationPolicy.ACCESSED) - .variableExpiration() - .build(); @Builder 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 626fed3..b4499c5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; @@ -15,7 +16,7 @@ import org.springframework.util.ObjectUtils; /** - * 结尾标志获取完整的数据报文 + * 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) @@ -23,7 +24,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index dfeb85d..905c728 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -18,16 +18,13 @@ /** * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() - - .maxSize(1000) - - .expiration(30, TimeUnit.SECONDS) - + public final static ExpiringMap> storeMap = ExpiringMap.builder() + .maxSize(10000) + //过期时间60分钟 + .expiration(60, TimeUnit.MINUTES) + //更新失效 .expirationPolicy(ExpirationPolicy.ACCESSED) - .variableExpiration() - .build(); @Builder diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java index f9894b6..e00a0e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -42,7 +42,7 @@ Calendar tempTailTime = tailMergeTime; for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); - tempTailTime.add(Calendar.MINUTE, -(i * interval)); + tempTailTime.add(Calendar.MINUTE, -interval); storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 626fed3..b4499c5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; @@ -15,7 +16,7 @@ import org.springframework.util.ObjectUtils; /** - * 结尾标志获取完整的数据报文 + * 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) @@ -23,7 +24,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index dfeb85d..905c728 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -18,16 +18,13 @@ /** * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() - - .maxSize(1000) - - .expiration(30, TimeUnit.SECONDS) - + public final static ExpiringMap> storeMap = ExpiringMap.builder() + .maxSize(10000) + //过期时间60分钟 + .expiration(60, TimeUnit.MINUTES) + //更新失效 .expirationPolicy(ExpirationPolicy.ACCESSED) - .variableExpiration() - .build(); @Builder diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java index f9894b6..e00a0e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -42,7 +42,7 @@ Calendar tempTailTime = tailMergeTime; for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); - tempTailTime.add(Calendar.MINUTE, -(i * interval)); + tempTailTime.add(Calendar.MINUTE, -interval); storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index c5f05a3..696cdf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Supplier; /** * @author cz @@ -25,6 +26,7 @@ private final DatagramEventConfig processorInstance; private final List subscribeConfigs; + private static Boolean textPlain = false; public ProcessorInstanceProvider(Long ruleId) { DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); @@ -55,11 +57,16 @@ * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Integer bizFieldLength) { + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? processorInstance.getSafeBean() : fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); @@ -69,6 +76,23 @@ return bizDataContent; } + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + /** * 报文加密 @@ -99,7 +123,7 @@ */ private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >=bizFieldLength) { + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { plainLength--; } plainBuf = plainBuf.slice(0, ++plainLength); 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 626fed3..b4499c5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; @@ -15,7 +16,7 @@ import org.springframework.util.ObjectUtils; /** - * 结尾标志获取完整的数据报文 + * 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) @@ -23,7 +24,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index dfeb85d..905c728 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -18,16 +18,13 @@ /** * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() - - .maxSize(1000) - - .expiration(30, TimeUnit.SECONDS) - + public final static ExpiringMap> storeMap = ExpiringMap.builder() + .maxSize(10000) + //过期时间60分钟 + .expiration(60, TimeUnit.MINUTES) + //更新失效 .expirationPolicy(ExpirationPolicy.ACCESSED) - .variableExpiration() - .build(); @Builder diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java index f9894b6..e00a0e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -42,7 +42,7 @@ Calendar tempTailTime = tailMergeTime; for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); - tempTailTime.add(Calendar.MINUTE, -(i * interval)); + tempTailTime.add(Calendar.MINUTE, -interval); storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index c5f05a3..696cdf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Supplier; /** * @author cz @@ -25,6 +26,7 @@ private final DatagramEventConfig processorInstance; private final List subscribeConfigs; + private static Boolean textPlain = false; public ProcessorInstanceProvider(Long ruleId) { DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); @@ -55,11 +57,16 @@ * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Integer bizFieldLength) { + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? processorInstance.getSafeBean() : fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); @@ -69,6 +76,23 @@ return bizDataContent; } + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + /** * 报文加密 @@ -99,7 +123,7 @@ */ private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >=bizFieldLength) { + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { plainLength--; } plainBuf = plainBuf.slice(0, ++plainLength); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index edec907..2c38e91 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -17,15 +17,20 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz * @date 2023-6-12 */ +@Slf4j public class ProtocolFieldConfigProvider implements FrameStructEnum { private static final String FIXED_FIELD_DS = "fixedFieldDs"; @@ -188,19 +193,47 @@ /** * 获取帧结构中业务字段的长度 */ - public Integer getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - if (showSkip()) { - return null; - } - //获取总长度 - Integer totalLength = getTotalLength(byteBuf, protocolConfig); - //获取固定长度 - Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); - return totalLength - fixFieldLength; + public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + return () -> { + if (showSkip()) { + return null; + } + //获取总长度 + Integer totalLength = getTotalLength(byteBuf, protocolConfig); + //获取固定长度 + Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); + return totalLength - fixFieldLength; + }; } /** + * 获取帧结构中业务字段的长度 + */ + public Supplier getHistoryBizFieldLength(Map fixedStoreMap, ProtocolConfig protocolConfig) { + return () -> { + if (showSkip()) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolConfig.getId()); + //获取约定字段的总长度 + Integer protocolFieldValue = 0; + if (fixedStoreMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixedStoreMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + Integer totalFilterLength = getTotalFilterLength(protocolConfig); + //计算总长度 + Integer totalLength = protocolFieldValue + totalFilterLength; + //获取固定长度 + Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); + return totalLength - fixFieldLength; + }; + } + + /** * 获取帧结构应有的总长度 */ public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { @@ -226,6 +259,8 @@ return null; } + + /** * 获取协议有关字段解析内容 * storeObjectMap存储代转存的数据 @@ -252,6 +287,19 @@ return null; } + public ByteBuf setDataContentBuf(String bizDataStr) { + log.debug("业务内容----------"+bizDataStr); + byte[] bizDataBytes = Hex.decode(bizDataStr); + ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); + bizFrameByte.writeBytes(bizDataBytes); + //获取缓存 + if (ObjectUtils.isNotEmpty(bizFrameByte)) { + bizFrameByte.resetReaderIndex(); + this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); + } + return bizFrameByte; + } + /** * 获取业务报文内容的content字节 * @@ -262,13 +310,16 @@ if (showSkip()) { return null; } + ByteBuf bizDataByteBuf = null; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + bizDataByteBuf.resetReaderIndex(); + return bizDataByteBuf; } FieldParser fieldParser = new DefaultProtocolFieldParser(); frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - ByteBuf bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); + bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); if (bizDataByteBuf != null) { this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); return bizDataByteBuf; @@ -316,7 +367,7 @@ * * @return */ - private Map getFixFieldConfigMap() { + public Map getFixFieldConfigMap() { Map fixDataFieldMap = protocolFieldConfigs.stream() .collect( Collectors.toMap(ProtocolFieldConfig::getId, e -> e) 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 626fed3..b4499c5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; @@ -15,7 +16,7 @@ import org.springframework.util.ObjectUtils; /** - * 结尾标志获取完整的数据报文 + * 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) @@ -23,7 +24,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index dfeb85d..905c728 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -18,16 +18,13 @@ /** * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() - - .maxSize(1000) - - .expiration(30, TimeUnit.SECONDS) - + public final static ExpiringMap> storeMap = ExpiringMap.builder() + .maxSize(10000) + //过期时间60分钟 + .expiration(60, TimeUnit.MINUTES) + //更新失效 .expirationPolicy(ExpirationPolicy.ACCESSED) - .variableExpiration() - .build(); @Builder diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java index f9894b6..e00a0e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -42,7 +42,7 @@ Calendar tempTailTime = tailMergeTime; for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); - tempTailTime.add(Calendar.MINUTE, -(i * interval)); + tempTailTime.add(Calendar.MINUTE, -interval); storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index c5f05a3..696cdf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Supplier; /** * @author cz @@ -25,6 +26,7 @@ private final DatagramEventConfig processorInstance; private final List subscribeConfigs; + private static Boolean textPlain = false; public ProcessorInstanceProvider(Long ruleId) { DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); @@ -55,11 +57,16 @@ * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Integer bizFieldLength) { + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? processorInstance.getSafeBean() : fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); @@ -69,6 +76,23 @@ return bizDataContent; } + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + /** * 报文加密 @@ -99,7 +123,7 @@ */ private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >=bizFieldLength) { + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { plainLength--; } plainBuf = plainBuf.slice(0, ++plainLength); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index edec907..2c38e91 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -17,15 +17,20 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz * @date 2023-6-12 */ +@Slf4j public class ProtocolFieldConfigProvider implements FrameStructEnum { private static final String FIXED_FIELD_DS = "fixedFieldDs"; @@ -188,19 +193,47 @@ /** * 获取帧结构中业务字段的长度 */ - public Integer getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - if (showSkip()) { - return null; - } - //获取总长度 - Integer totalLength = getTotalLength(byteBuf, protocolConfig); - //获取固定长度 - Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); - return totalLength - fixFieldLength; + public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + return () -> { + if (showSkip()) { + return null; + } + //获取总长度 + Integer totalLength = getTotalLength(byteBuf, protocolConfig); + //获取固定长度 + Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); + return totalLength - fixFieldLength; + }; } /** + * 获取帧结构中业务字段的长度 + */ + public Supplier getHistoryBizFieldLength(Map fixedStoreMap, ProtocolConfig protocolConfig) { + return () -> { + if (showSkip()) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolConfig.getId()); + //获取约定字段的总长度 + Integer protocolFieldValue = 0; + if (fixedStoreMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixedStoreMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + Integer totalFilterLength = getTotalFilterLength(protocolConfig); + //计算总长度 + Integer totalLength = protocolFieldValue + totalFilterLength; + //获取固定长度 + Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); + return totalLength - fixFieldLength; + }; + } + + /** * 获取帧结构应有的总长度 */ public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { @@ -226,6 +259,8 @@ return null; } + + /** * 获取协议有关字段解析内容 * storeObjectMap存储代转存的数据 @@ -252,6 +287,19 @@ return null; } + public ByteBuf setDataContentBuf(String bizDataStr) { + log.debug("业务内容----------"+bizDataStr); + byte[] bizDataBytes = Hex.decode(bizDataStr); + ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); + bizFrameByte.writeBytes(bizDataBytes); + //获取缓存 + if (ObjectUtils.isNotEmpty(bizFrameByte)) { + bizFrameByte.resetReaderIndex(); + this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); + } + return bizFrameByte; + } + /** * 获取业务报文内容的content字节 * @@ -262,13 +310,16 @@ if (showSkip()) { return null; } + ByteBuf bizDataByteBuf = null; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + bizDataByteBuf.resetReaderIndex(); + return bizDataByteBuf; } FieldParser fieldParser = new DefaultProtocolFieldParser(); frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - ByteBuf bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); + bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); if (bizDataByteBuf != null) { this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); return bizDataByteBuf; @@ -316,7 +367,7 @@ * * @return */ - private Map getFixFieldConfigMap() { + public Map getFixFieldConfigMap() { Map fixDataFieldMap = protocolFieldConfigs.stream() .collect( Collectors.toMap(ProtocolFieldConfig::getId, e -> e) diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml new file mode 100644 index 0000000..0a78bf1 --- /dev/null +++ b/sensorhub-core/src/main/resources/config/application-bd.yml @@ -0,0 +1,22 @@ +server: + port: 7080 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + session: + store-type: redis + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +logging: + level.root: error + level.com.casic: debug + file: + path: logs/ + name: missiles.log \ No newline at end of file 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 7641af1..f8c2fe4 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 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * @author cz @@ -52,6 +53,7 @@ if (ObjectUtil.isEmpty(protocolConfig)) { return null; } + ParseResult result = null; try { //暂时先取第一个, 减少类的创建销毁与构建 @@ -80,20 +82,20 @@ //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) { + if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventProvider)) != null) { break; } } + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //没有匹配成功 if (ObjectUtil.isEmpty(intactMessageByte)) { return ParseResult.builder().replyCommand(NONE_DATA).build(); } - Integer bizFieldLength = protocolFactory.getProtocolFieldConfigProvider().getBizFieldLength(intactMessageByte, protocolConfig); //获取报文的业务内容 ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte); log.debug("解析的密文是----------"+ByteBufUtil.hexDump(bizDataByteBuf)); //密文解析 - ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),bizFieldLength); + ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(),fieldLengthSupplier); log.debug("解析的明文是----------"+ByteBufUtil.hexDump(clearZeroPlainBuf)); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index d177fc3..8af55a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -42,12 +42,12 @@ if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte, protocolConfig.getFieldRuleConfigMap()); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) ); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, rulePrepareFields, protocolFieldConfigs); - log.info("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); + log.debug("协议字段内容为" + JSON.toJSONString(parseFixedDataMap) + "匹配的规则内容为" + JSON.toJSON(ruleConfig)); return ruleConfig; } return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index 94e34fc..66df421 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -34,6 +34,10 @@ * @return */ protected ByteBuf matchLength(ByteBuf byteBuf, Integer groupLength, AbstractProtocolConfigFactory protocolFactory) { + //健壮性判断 + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { + return null; + } ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); @@ -60,6 +64,7 @@ } ByteBuf reMatchByteBuf = doMatchLength(byteBuf, totalLength); if (ObjectUtils.isNotEmpty(reMatchByteBuf)) { + byteBuf.markReaderIndex(); return reMatchByteBuf; } else { //失败匹配,执行对帧进行有效性扫描 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index f8a51fb..0584110 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -2,10 +2,11 @@ import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import io.netty.buffer.ByteBuf; /** - * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 + * 通过帧结构,进行帧粘包,截取包、数据完整性等问题的处理 * 分析匹配情况 * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 * 2、匹配不成功,有后续帧,可以进行下次匹配。 @@ -20,7 +21,7 @@ * * @return */ - ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig); + ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide); } 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 2e0d6cb..40726ac 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 @@ -5,6 +5,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -25,7 +26,7 @@ * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { @@ -35,7 +36,7 @@ if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); if (matchByteBuf != null) {//等于长度返回true,超出长度,切断 //根据CRC校验取值,如果存在加密 byteBuf.markReaderIndex();//读的标志位前移 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 1b47045..446485b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,12 +1,14 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatchSupport; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.store.MatchDataStore; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; @@ -20,11 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz - * 后续标志获取完整实例数据报文 + * 后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 @@ -39,83 +42,94 @@ * 获取实例完整的数据包 */ @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || protocolFieldConfigProvider == null) { return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf, protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { - ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf, protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 - intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFieldConfigProvider, protocolConfig); + intactMessageByte = mergeMarkFrame(matchByteBuf, protocolFactory, datagramEventProvide); return intactMessageByte; } else { storeHalfPackBuf(protocolFactory, matchByteBuf); } - matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); + matchByteBuf = matchLength(byteBuf, datagramEventProvide.getProcessorInstance().getSafeLength(), protocolFactory); } } return null; } /** - * 获取完整的报文,有历史包进行帧结构合并 + * 获取完整的报文,有历史包进行帧结构合并 *

* 查询是否有历史半包帧,获取历史帧尾部列表 * 1、当前帧为结尾标志帧,进行尾结点添加 * 2、根据帧结构位置信息,合并相关的帧信息 */ - private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, ProtocolFieldConfigProvider protocolFieldConfigProvider, - ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBufContent, protocolConfig); + private ByteBuf mergeMarkFrame(ByteBuf byteBufContent, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvider) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + Map currentFrameFixedProperty = protocolFactory.getProtocolFieldConfigProvider().getFixedProperty(byteBufContent, protocolConfig); //重置 ByteBuf mergeWholeFrameByte = ByteBufAllocator.DEFAULT.buffer(); - String mergeFrameStr = ""; - String tail = ""; + String tail = "", headFrame = "", bizFrameStr = ""; log.debug("--合并前" + ByteBufUtil.hexDump(byteBufContent)); - String key = (String) protocolFieldConfigProvider.getStoreObjectMap().get("devcode"); + String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); List sortList = getStoreHalfPackBuf(key); //添加当前的帧信息 +// Map parseFixedDataMap = protocolFactory.getProtocolFieldConfigProvider().getProtocolDataMap(null, protocolConfig.getFieldRuleConfigMap()); sortList.add(MatchDataStore.ExpiringByteBuf.builder() .byteBuf(byteBufContent) .tailPosition(currentFrameFixedProperty.get(TAIL_POSITION)) .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) - .fixedStoreMap(protocolFieldConfigProvider.getStoreObjectMap()) + .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); //会存在多个帧拼接在一起的的情况,进行合并处理 for (MatchDataStore.ExpiringByteBuf expiringByteBuf : sortList) { ByteBuf currentByteBuf = expiringByteBuf.getByteBuf(); currentByteBuf.resetReaderIndex(); String hexDump = ByteBufUtil.hexDump(currentByteBuf); - //获取当前固定帧结构的关系map - if (StringUtils.isEmpty(mergeFrameStr)) { - //首次获取业务数据报文 - mergeFrameStr += hexDump.substring(0, expiringByteBuf.getTailPosition() * 2); + //合并报文,需要将密文进行提前解密合并,获取当前固定帧结构的关系map + Supplier fieldLengthSupplier = protocolFactory.getProtocolFieldConfigProvider().getHistoryBizFieldLength(expiringByteBuf.getFixedStoreMap(), protocolConfig); + if (StringUtils.isEmpty(bizFrameStr)) { + headFrame = hexDump.substring(0, expiringByteBuf.getFixPosition() * 2); + //首次获取业务数据报文,明文合并,密文合并还存在问题 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr = plainText; tail = hexDump.substring(expiringByteBuf.getTailPosition() * 2); } else { - //再次获取业务数据报文 - mergeFrameStr += hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition() - 1) * 2); + //是否需要解密 + String encipherHex = hexDump.substring(expiringByteBuf.getFixPosition() * 2, (expiringByteBuf.getTailPosition()) * 2); + String plainText = datagramEventProvider.getPlainTextDatagram(encipherHex, protocolFactory.getProtocolFieldConfigProvider().getFixFieldConfigMap(), fieldLengthSupplier); + bizFrameStr += plainText; } } - mergeFrameStr += tail; - mergeWholeFrameByte.writeBytes(Hex.decode(mergeFrameStr)); + ByteBuf bizFrameByte = protocolFactory.getProtocolFieldConfigProvider().setDataContentBuf(bizFrameStr); + //增加头 + mergeWholeFrameByte.writeBytes(Hex.decode(headFrame)); + //增加业务内容 + mergeWholeFrameByte.writeBytes(bizFrameByte); + //增加尾部 + mergeWholeFrameByte.writeBytes(Hex.decode(tail)); log.debug("--合并后--" + ByteBufUtil.hexDump(mergeWholeFrameByte)); return mergeWholeFrameByte; } /** - * 存储当前不需要直接进行的帧结构及相应的帧结构信息 + * 存储当前不需要直接进行的帧结构及相应的帧结构信息 * * @param protocolFactory * @param byteBuf @@ -127,7 +141,7 @@ Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); List storeList = new ArrayList<>(); String key = (String) protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap().get("devcode"); - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); } @@ -139,18 +153,19 @@ .fixPosition(currentFrameFixedProperty.get(FIXED_POSITION)) .fixedStoreMap(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()) .build()); + log.info("设备内容为{}执行挂起,挂起序号为{}", JSON.toJSON(protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap()), storeList.size()); MatchDataStore.storeMap.put(key, storeList); return true; } /** - * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 + * 获取历史存在的缓存列表,同时按照指定的序列号进行排序 * * @param key * @return */ private List getStoreHalfPackBuf(String key) { - key += Thread.currentThread().getName(); +// key += Thread.currentThread().getName(); List storeList = new ArrayList<>(); if (MatchDataStore.storeMap.containsKey(key)) { storeList = MatchDataStore.storeMap.get(key); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 626fed3..b4499c5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; @@ -15,7 +16,7 @@ import org.springframework.util.ObjectUtils; /** - * 结尾标志获取完整的数据报文 + * 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) @@ -23,7 +24,7 @@ //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { + public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, ProcessorInstanceProvider datagramEventProvide) { ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); if (protocolConfig == null || fieldConfigProvider == null) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index dfeb85d..905c728 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -18,16 +18,13 @@ /** * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() - - .maxSize(1000) - - .expiration(30, TimeUnit.SECONDS) - + public final static ExpiringMap> storeMap = ExpiringMap.builder() + .maxSize(10000) + //过期时间60分钟 + .expiration(60, TimeUnit.MINUTES) + //更新失效 .expirationPolicy(ExpirationPolicy.ACCESSED) - .variableExpiration() - .build(); @Builder diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java index f9894b6..e00a0e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -42,7 +42,7 @@ Calendar tempTailTime = tailMergeTime; for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); - tempTailTime.add(Calendar.MINUTE, -(i * interval)); + tempTailTime.add(Calendar.MINUTE, -interval); storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index c5f05a3..696cdf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Supplier; /** * @author cz @@ -25,6 +26,7 @@ private final DatagramEventConfig processorInstance; private final List subscribeConfigs; + private static Boolean textPlain = false; public ProcessorInstanceProvider(Long ruleId) { DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); @@ -55,11 +57,16 @@ * @param fieldConfigMap * @return */ - public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Integer bizFieldLength) { + public ByteBuf getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + //如果执行完合并的解密,不需要再次进行解密,直接跳出 + if (textPlain) { + return bizDataContent; + } String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? processorInstance.getSafeBean() : fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); //需要加密 SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); ByteBuf plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); @@ -69,6 +76,23 @@ return bizDataContent; } + public String getPlainTextDatagram(String bizDataContent, Map fieldConfigMap, Supplier fieldLengthSupplier) { + textPlain = true; + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + Integer bizFieldLength = fieldLengthSupplier.get(); + //需要加密 + SafeStrategy safeStrategy = SpringContextUtil.getBean(safeName); + ByteBuf plain = safeStrategy.decryption(bizDataContent); + //根据长度进行截取0的判断 + ByteBuf plainByteBuf = clearComplementZero(plain, bizFieldLength); + return ObjectUtils.isEmpty(plainByteBuf) ? "" : ByteBufUtil.hexDump(plainByteBuf); + } + return bizDataContent; + } + /** * 报文加密 @@ -99,7 +123,7 @@ */ private ByteBuf clearComplementZero(ByteBuf plainBuf, int bizFieldLength) { Integer plainLength = ByteBufUtil.hexDump(plainBuf).length() / 2; - while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >=bizFieldLength) { + while (plainBuf.getByte(plainLength) == (byte) 0x00 && plainLength >= bizFieldLength) { plainLength--; } plainBuf = plainBuf.slice(0, ++plainLength); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index edec907..2c38e91 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -17,15 +17,20 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; /** * @author cz * @date 2023-6-12 */ +@Slf4j public class ProtocolFieldConfigProvider implements FrameStructEnum { private static final String FIXED_FIELD_DS = "fixedFieldDs"; @@ -188,19 +193,47 @@ /** * 获取帧结构中业务字段的长度 */ - public Integer getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - if (showSkip()) { - return null; - } - //获取总长度 - Integer totalLength = getTotalLength(byteBuf, protocolConfig); - //获取固定长度 - Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); - return totalLength - fixFieldLength; + public Supplier getBizFieldLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + return () -> { + if (showSkip()) { + return null; + } + //获取总长度 + Integer totalLength = getTotalLength(byteBuf, protocolConfig); + //获取固定长度 + Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); + return totalLength - fixFieldLength; + }; } /** + * 获取帧结构中业务字段的长度 + */ + public Supplier getHistoryBizFieldLength(Map fixedStoreMap, ProtocolConfig protocolConfig) { + return () -> { + if (showSkip()) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolConfig.getId()); + //获取约定字段的总长度 + Integer protocolFieldValue = 0; + if (fixedStoreMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixedStoreMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + Integer totalFilterLength = getTotalFilterLength(protocolConfig); + //计算总长度 + Integer totalLength = protocolFieldValue + totalFilterLength; + //获取固定长度 + Integer fixFieldLength = ProtocolFieldConfigUtil.calculateOffset(this.getProtocolFieldConfigs()); + return totalLength - fixFieldLength; + }; + } + + /** * 获取帧结构应有的总长度 */ public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { @@ -226,6 +259,8 @@ return null; } + + /** * 获取协议有关字段解析内容 * storeObjectMap存储代转存的数据 @@ -252,6 +287,19 @@ return null; } + public ByteBuf setDataContentBuf(String bizDataStr) { + log.debug("业务内容----------"+bizDataStr); + byte[] bizDataBytes = Hex.decode(bizDataStr); + ByteBuf bizFrameByte = ByteBufAllocator.DEFAULT.buffer(); + bizFrameByte.writeBytes(bizDataBytes); + //获取缓存 + if (ObjectUtils.isNotEmpty(bizFrameByte)) { + bizFrameByte.resetReaderIndex(); + this.singleObjects.put(CONTENT_FIELD_DS, bizFrameByte); + } + return bizFrameByte; + } + /** * 获取业务报文内容的content字节 * @@ -262,13 +310,16 @@ if (showSkip()) { return null; } + ByteBuf bizDataByteBuf = null; //获取缓存 if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { - return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + bizDataByteBuf = (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + bizDataByteBuf.resetReaderIndex(); + return bizDataByteBuf; } FieldParser fieldParser = new DefaultProtocolFieldParser(); frameStructMap = fieldParser.getFrameStructBuf(protocolFieldConfigs, wholeDatagramByte); - ByteBuf bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); + bizDataByteBuf = frameStructMap.get(AROUND_BUSINESS_CONTENT); if (bizDataByteBuf != null) { this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); return bizDataByteBuf; @@ -316,7 +367,7 @@ * * @return */ - private Map getFixFieldConfigMap() { + public Map getFixFieldConfigMap() { Map fixDataFieldMap = protocolFieldConfigs.stream() .collect( Collectors.toMap(ProtocolFieldConfig::getId, e -> e) diff --git a/sensorhub-core/src/main/resources/config/application-bd.yml b/sensorhub-core/src/main/resources/config/application-bd.yml new file mode 100644 index 0000000..0a78bf1 --- /dev/null +++ b/sensorhub-core/src/main/resources/config/application-bd.yml @@ -0,0 +1,22 @@ +server: + port: 7080 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/casic_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + username: root + password: Casic203 + session: + store-type: redis + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +logging: + level.root: error + level.com.casic: debug + file: + path: logs/ + name: missiles.log \ No newline at end of file diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index 14c278d..a15c202 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -20,10 +20,6 @@ * 协议配置id */ private Long ruleId; - /** - * 字段名称 - */ - private String fieldName; private String ownerId; private Date createTime; private Date lastTime;