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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java new file mode 100644 index 0000000..32d11a4 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java new file mode 100644 index 0000000..32d11a4 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 644d02c..04e4e36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,8 +1,9 @@ package com.casic.missiles.parser.rule; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.pojo.RuleConfig; +import lombok.extern.slf4j.Slf4j; import java.util.*; @@ -12,6 +13,7 @@ * @author cz * @date 2023-6-12 */ +@Slf4j public class RuleResolverCore { @@ -35,15 +37,21 @@ .filter(ruleConfig -> machRuleConfig( JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) .findFirst(); - if (ObjectUtil.isEmpty(ruleConfigOptional)) { - return null; - } - String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); - //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { - Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); - //递归选定规则 - doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + try { + if (!ruleConfigOptional.isPresent()) { + return null; + } + if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + //递归选定解析规则,进行规则解析 + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + } + } catch (RuntimeException rx) { + log.error("规则匹配异常,匹配的初始化内容化为{},异常信息为", JSON.toJSON(metaDataMap), rx); } return ruleConfigOptional.get(); } @@ -79,7 +87,7 @@ */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { - return null; + return false; } //所有的字段在规则里面必须有有配置 for (String key : metaDataMap.keySet()) { 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java new file mode 100644 index 0000000..32d11a4 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 644d02c..04e4e36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,8 +1,9 @@ package com.casic.missiles.parser.rule; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.pojo.RuleConfig; +import lombok.extern.slf4j.Slf4j; import java.util.*; @@ -12,6 +13,7 @@ * @author cz * @date 2023-6-12 */ +@Slf4j public class RuleResolverCore { @@ -35,15 +37,21 @@ .filter(ruleConfig -> machRuleConfig( JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) .findFirst(); - if (ObjectUtil.isEmpty(ruleConfigOptional)) { - return null; - } - String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); - //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { - Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); - //递归选定规则 - doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + try { + if (!ruleConfigOptional.isPresent()) { + return null; + } + if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + //递归选定解析规则,进行规则解析 + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + } + } catch (RuntimeException rx) { + log.error("规则匹配异常,匹配的初始化内容化为{},异常信息为", JSON.toJSON(metaDataMap), rx); } return ruleConfigOptional.get(); } @@ -79,7 +87,7 @@ */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { - return null; + return false; } //所有的字段在规则里面必须有有配置 for (String key : metaDataMap.keySet()) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index 2a4be73..9d8ae1e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = null; @@ -117,12 +117,12 @@ } /** - * 校验是一个完整的操作 + * 校验是一个整数的byte组操作 * * @param sortFieldConfigs * @return */ - private static Boolean checkOutFrame(List sortFieldConfigs) { + private static Boolean checkOutByteGroup(List sortFieldConfigs) { Integer bitFixedLength = 0; for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { if (sortFieldConfig.getOffsetUnit().equals("bit")) { 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java new file mode 100644 index 0000000..32d11a4 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 644d02c..04e4e36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,8 +1,9 @@ package com.casic.missiles.parser.rule; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.pojo.RuleConfig; +import lombok.extern.slf4j.Slf4j; import java.util.*; @@ -12,6 +13,7 @@ * @author cz * @date 2023-6-12 */ +@Slf4j public class RuleResolverCore { @@ -35,15 +37,21 @@ .filter(ruleConfig -> machRuleConfig( JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) .findFirst(); - if (ObjectUtil.isEmpty(ruleConfigOptional)) { - return null; - } - String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); - //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { - Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); - //递归选定规则 - doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + try { + if (!ruleConfigOptional.isPresent()) { + return null; + } + if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + //递归选定解析规则,进行规则解析 + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + } + } catch (RuntimeException rx) { + log.error("规则匹配异常,匹配的初始化内容化为{},异常信息为", JSON.toJSON(metaDataMap), rx); } return ruleConfigOptional.get(); } @@ -79,7 +87,7 @@ */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { - return null; + return false; } //所有的字段在规则里面必须有有配置 for (String key : metaDataMap.keySet()) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index 2a4be73..9d8ae1e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = null; @@ -117,12 +117,12 @@ } /** - * 校验是一个完整的操作 + * 校验是一个整数的byte组操作 * * @param sortFieldConfigs * @return */ - private static Boolean checkOutFrame(List sortFieldConfigs) { + private static Boolean checkOutByteGroup(List sortFieldConfigs) { Integer bitFixedLength = 0; for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { if (sortFieldConfig.getOffsetUnit().equals("bit")) { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index d3b040a..2786461 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -12,7 +12,8 @@ COMBINED_PRE_CODE_FIELD_NULL(3001, "组合配合匹配前导码为空"), COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), - REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"); + REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), + PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"); private Integer code; private String message; 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java new file mode 100644 index 0000000..32d11a4 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 644d02c..04e4e36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,8 +1,9 @@ package com.casic.missiles.parser.rule; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.pojo.RuleConfig; +import lombok.extern.slf4j.Slf4j; import java.util.*; @@ -12,6 +13,7 @@ * @author cz * @date 2023-6-12 */ +@Slf4j public class RuleResolverCore { @@ -35,15 +37,21 @@ .filter(ruleConfig -> machRuleConfig( JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) .findFirst(); - if (ObjectUtil.isEmpty(ruleConfigOptional)) { - return null; - } - String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); - //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { - Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); - //递归选定规则 - doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + try { + if (!ruleConfigOptional.isPresent()) { + return null; + } + if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + //递归选定解析规则,进行规则解析 + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + } + } catch (RuntimeException rx) { + log.error("规则匹配异常,匹配的初始化内容化为{},异常信息为", JSON.toJSON(metaDataMap), rx); } return ruleConfigOptional.get(); } @@ -79,7 +87,7 @@ */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { - return null; + return false; } //所有的字段在规则里面必须有有配置 for (String key : metaDataMap.keySet()) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index 2a4be73..9d8ae1e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = null; @@ -117,12 +117,12 @@ } /** - * 校验是一个完整的操作 + * 校验是一个整数的byte组操作 * * @param sortFieldConfigs * @return */ - private static Boolean checkOutFrame(List sortFieldConfigs) { + private static Boolean checkOutByteGroup(List sortFieldConfigs) { Integer bitFixedLength = 0; for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { if (sortFieldConfig.getOffsetUnit().equals("bit")) { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index d3b040a..2786461 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -12,7 +12,8 @@ COMBINED_PRE_CODE_FIELD_NULL(3001, "组合配合匹配前导码为空"), COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), - REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"); + REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), + PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java index 23f687f..ee6b7cc 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -17,7 +17,7 @@ /** * 按照字段评估进行字段解析 */ - private String ruleJson; + private String ruleIds; private String replyRule; /** 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java new file mode 100644 index 0000000..32d11a4 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 644d02c..04e4e36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,8 +1,9 @@ package com.casic.missiles.parser.rule; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.pojo.RuleConfig; +import lombok.extern.slf4j.Slf4j; import java.util.*; @@ -12,6 +13,7 @@ * @author cz * @date 2023-6-12 */ +@Slf4j public class RuleResolverCore { @@ -35,15 +37,21 @@ .filter(ruleConfig -> machRuleConfig( JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) .findFirst(); - if (ObjectUtil.isEmpty(ruleConfigOptional)) { - return null; - } - String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); - //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { - Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); - //递归选定规则 - doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + try { + if (!ruleConfigOptional.isPresent()) { + return null; + } + if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + //递归选定解析规则,进行规则解析 + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + } + } catch (RuntimeException rx) { + log.error("规则匹配异常,匹配的初始化内容化为{},异常信息为", JSON.toJSON(metaDataMap), rx); } return ruleConfigOptional.get(); } @@ -79,7 +87,7 @@ */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { - return null; + return false; } //所有的字段在规则里面必须有有配置 for (String key : metaDataMap.keySet()) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index 2a4be73..9d8ae1e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = null; @@ -117,12 +117,12 @@ } /** - * 校验是一个完整的操作 + * 校验是一个整数的byte组操作 * * @param sortFieldConfigs * @return */ - private static Boolean checkOutFrame(List sortFieldConfigs) { + private static Boolean checkOutByteGroup(List sortFieldConfigs) { Integer bitFixedLength = 0; for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { if (sortFieldConfig.getOffsetUnit().equals("bit")) { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index d3b040a..2786461 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -12,7 +12,8 @@ COMBINED_PRE_CODE_FIELD_NULL(3001, "组合配合匹配前导码为空"), COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), - REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"); + REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), + PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java index 23f687f..ee6b7cc 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -17,7 +17,7 @@ /** * 按照字段评估进行字段解析 */ - private String ruleJson; + private String ruleIds; private String replyRule; /** 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 1b6ffaf..14c278d 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 @@ -21,10 +21,6 @@ */ private Long ruleId; /** - * 回复规则 - */ - private String ruleJson; - /** * 字段名称 */ private String fieldName; 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 f05ff1f..fd17e68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,7 +1,10 @@ package com.casic.missiles.parser; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.exception.EngineException; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.factory.impl.DefaultProtocolConfigFactory; @@ -14,10 +17,12 @@ import com.casic.missiles.provider.ProtocolConfigProvider; import com.casic.missiles.util.ClazzUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @author cz @@ -54,6 +59,9 @@ // 通过协议工厂匹配,匹配规则,获取规则配置 RuleConfig ruleConfig = getRuleConfig(protocolFactory, byteBuf); if (ObjectUtil.isEmpty(ruleConfig)) { + byteBuf.resetReaderIndex(); + log.error("解析匹配失败,匹配帧信息为", ByteBufUtil.hexDump(byteBuf.readBytes(protocolConfig.getPreFix().length()))); + byteBuf.markReaderIndex(); //如果出现匹配情况 return ParseResult.builder().replyCommand(NONE_DATA).build(); } @@ -62,6 +70,9 @@ //获取流程实例配置 ProcessorInstanceProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance(); + Assert.isFalse(Objects.isNull(datagramEventConfig), () -> { + throw new EngineException(EngineExceptionEnum.PROTOCOL_INSTANCE_NULL); + }); //处理粘包拆包的主要组合 List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true); ByteBuf intactMessageByte = null; @@ -82,9 +93,9 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 @@ -98,13 +109,17 @@ datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { log.error("解析出现异常,异常信息为{}", rex); - byteBuf.resetReaderIndex(); - byteBuf.readBytes(protocolConfig.getPreFix().length()); - byteBuf.markReaderIndex(); + frozenInvalidByteBuf(byteBuf, protocolConfig); LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; } + private void frozenInvalidByteBuf(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + byteBuf.resetReaderIndex(); + byteBuf.readBytes(protocolConfig.getPreFix().length()); + byteBuf.markReaderIndex(); + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 2e5fe83..5a0bdd5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -63,7 +63,7 @@ //截取字符串长度 if (matchFirstLeadCodeMap.isPresent()) { Integer firstLeadCodeIndex = (Integer) matchFirstLeadCodeMap.get().get(LEAD__CODE_INDEX); - byteBuf.readBytes(firstLeadCodeIndex); + byteBuf.readBytes(firstLeadCodeIndex/2); byteBuf.markReaderIndex(); } else { //深层度匹配匹配失败舍弃当前byte并且返回配置为null diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java index ca55902..534bdde 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -1,5 +1,7 @@ package com.casic.missiles.parser.processor.reply; +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.factory.AbstractProtocolConfigFactory; import com.casic.missiles.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; @@ -20,7 +22,11 @@ @Override public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + if(CollectionUtils.isEmpty(bizDataMap)){ + throw new RuntimeException("业务内容解析为空,解析配置存在问题,请分析查看"); + } result = ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index 5226924..7901ce0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -1,15 +1,14 @@ package com.casic.missiles.parser.resolver; -import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; -import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; -import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,20 +28,18 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf,String ruleIds, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - byteBufList.add(byteBuf.readByte()); + for (int i =0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readBytes(1)); } + String[] ruleStrs=ruleIds.split(","); //通过类型可以控制aviator入参出参的数据 - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("ruleTypeId")) { - continue; - } - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String ruleType = String.valueOf(ruleMap.get("ruleType")); + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); //合并规则进行执行字段合并 switch (ruleType) { case "combine": @@ -51,16 +48,16 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } + byteBufList=tempByteBufList; break; case "decorate": List decorateByteBufList = new ArrayList<>(); - FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } + byteBufList=decorateByteBufList; break; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java deleted file mode 100644 index d03b5e2..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * @author cz - * 合并 - */ -@Slf4j -public class ByteMergeResolver { - - /** - * 入参:值串 - * 出参:值 - * 合并如果是字符串就是拼接,其他执行数值的移动 - * - * @param beToMergeObjects 待合并的对象集合 - * @return - */ - public static Object resolveRule(List beToMergeObjects) { - if (CollectionUtils.isEmpty(beToMergeObjects)) { - return null; - } - Object defaultResolveValue = null; - if (beToMergeObjects.get(0) instanceof String) { - String strResolveValue = ""; - for (Object beToMergeObject : beToMergeObjects) { - strResolveValue += (String) beToMergeObject; - } - defaultResolveValue = strResolveValue; - } - if (beToMergeObjects.get(0) instanceof Long) { - try { - Long longValueData = 0L; - for (Object beToMergeObject : beToMergeObjects) { - longValueData = (longValueData & 0xff) << 8; - longValueData = longValueData | (Long) beToMergeObject; - } - } catch (RuntimeException rex) { - log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); - return null; - - } - } - - - return defaultResolveValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java deleted file mode 100644 index e60567d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 数值类型转换规则 - */ -@Slf4j -public class ByteTypeResolver { - - /** - * 入参:单个byte串、转换类型 - * 出参: 当前的值 - * - * @param - * @return - */ - public static Object resolveRule(Object byteBuf, String convertType) { - Object parseValue = null; - switch (convertType) { - case "hexStr": - parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); - break; - case "assii": - parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); - break; - case "double": - parseValue = Double.longBitsToDouble((long) byteBuf); - break; - case "float": - parseValue = Float.floatToIntBits((long) byteBuf); - break; - case "int": - parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; - break; - } - return parseValue; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java deleted file mode 100644 index 3f4a219..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 运算缩减等操作,这里支持aviator - * 格式,精度运算等操作 - */ -@Slf4j -public class DecorateResolver { - - /** - * 入参:值 - * 出参:值 - * 数值的转换 - * 混合运算,有常量或者乘除的缩放 - */ - public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - value = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java deleted file mode 100644 index fa04480..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author cz - * 精度计算,格式转换? - */ -@Slf4j -public class PrecisionResolver { - - public Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", value); - String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java index 46e03b8..338be3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -56,9 +56,6 @@ } } } - if (!CollectionUtils.isEmpty(storeObjectList)) { - storeObjectList.stream(); - } System.out.println(JSON.toJSON(storeObjectList)); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 3f70f2c..8eb3362 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); Integer currentIndex = 0, fieldCurrent = 0; - while (fieldCurrent < combinedFieldParam.getTotalLength()) { + while (fieldCurrent storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index b1a09f9..2e374bb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -30,11 +30,10 @@ Object fieldsResolveValue = null; String binaryStr = convertBinaryStr(byteBuf, fieldConfig); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + if (StringUtils.isEmpty(fieldConfig.getRuleIds())) { fieldsResolveValue = defaultBitResolve(binaryStr); } else { - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, fieldConfig.getRuleIds(), fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,11 +55,11 @@ * * @return */ - private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + private static Object doResolveFieldBitRule(String binaryStr, String ruleIds, Map fieldRuleConfigMap) { byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); byteBuf.writeBytes(binaryBytes); - return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + return doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 7ed1f42..c1ca720 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; @@ -22,16 +23,15 @@ * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 * * @param byteBuf - * @param ruleJson + * @param ruleIds * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleIds, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (CollectionUtils.isEmpty(ruleMapList)) { + if (StringUtils.isEmpty(ruleIds)) { fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleIds, fieldRuleConfigMap); } return fieldsResolveValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index c19c573..4ec91e8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -39,7 +39,7 @@ } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex(); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleIds(),fieldRuleConfigMap); } } catch (RuntimeException ex) { throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java new file mode 100644 index 0000000..ae6d71d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteMergeResolver.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java new file mode 100644 index 0000000..f11268d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/ByteTypeResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.rule; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.Charset; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "charset": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + }catch (RuntimeException rx){ + log.error("转换异常,转换类型为{},异常信息为{}", convertType,rx); + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java new file mode 100644 index 0000000..8afe2e0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/DecorateResolver.java @@ -0,0 +1,44 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java new file mode 100644 index 0000000..32d11a4 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.parser.resolver.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index 644d02c..04e4e36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -1,8 +1,9 @@ package com.casic.missiles.parser.rule; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.pojo.RuleConfig; +import lombok.extern.slf4j.Slf4j; import java.util.*; @@ -12,6 +13,7 @@ * @author cz * @date 2023-6-12 */ +@Slf4j public class RuleResolverCore { @@ -35,15 +37,21 @@ .filter(ruleConfig -> machRuleConfig( JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) .findFirst(); - if (ObjectUtil.isEmpty(ruleConfigOptional)) { - return null; - } - String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); - //递归选定解析规则,进行规则解析 - if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { - Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); - //递归选定规则 - doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + try { + if (!ruleConfigOptional.isPresent()) { + return null; + } + if (StringUtils.isNotEmpty(ruleConfigOptional.get().getDataFieldIds())) { + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + //递归选定解析规则,进行规则解析 + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + } + } catch (RuntimeException rx) { + log.error("规则匹配异常,匹配的初始化内容化为{},异常信息为", JSON.toJSON(metaDataMap), rx); } return ruleConfigOptional.get(); } @@ -79,7 +87,7 @@ */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { - return null; + return false; } //所有的字段在规则里面必须有有配置 for (String key : metaDataMap.keySet()) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index 2a4be73..9d8ae1e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutByteGroup(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = null; @@ -117,12 +117,12 @@ } /** - * 校验是一个完整的操作 + * 校验是一个整数的byte组操作 * * @param sortFieldConfigs * @return */ - private static Boolean checkOutFrame(List sortFieldConfigs) { + private static Boolean checkOutByteGroup(List sortFieldConfigs) { Integer bitFixedLength = 0; for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { if (sortFieldConfig.getOffsetUnit().equals("bit")) { diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index d3b040a..2786461 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -12,7 +12,8 @@ COMBINED_PRE_CODE_FIELD_NULL(3001, "组合配合匹配前导码为空"), COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), - REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"); + REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"), + PROTOCOL_INSTANCE_NULL(3005, "流程实例配置为空"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java index 23f687f..ee6b7cc 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -17,7 +17,7 @@ /** * 按照字段评估进行字段解析 */ - private String ruleJson; + private String ruleIds; private String replyRule; /** 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 1b6ffaf..14c278d 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 @@ -21,10 +21,6 @@ */ private Long ruleId; /** - * 回复规则 - */ - private String ruleJson; - /** * 字段名称 */ private String fieldName; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java index 42debca..7ce3eb1 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -12,7 +12,7 @@ private Long id; private Long protocolId; private String name; - private Long ruleType; + private String ruleType; private String descn; private String expression; private Date lastTime;