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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 82b698e..d34c071 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 @@ -9,8 +9,11 @@ import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import org.springframework.beans.BeanUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author cz @@ -24,25 +27,29 @@ Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); - for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { - if (!ObjectUtils.isEmpty(abstractFieldConfig.getOriginPositionByte())) { - abstractFieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + abstractFieldConfig.getOriginPositionByte()); + Integer currentIndex = 0, fieldCurrent = 0; + while (fieldCurrent < combinedFieldParam.getTotalLength()) { + //先取,然后是创建 + Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); + for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { + fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - combinedFieldParam.getStoreObjectMap().put(abstractFieldConfig.getFieldName(), fieldValue); + storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(calculateProcessPosition(protocolFieldConfigs)); + combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); return null; } /** - * 计算处理位置 + * 计算处理后的偏移位置 */ - private Integer calculateProcessPosition(List protocolFieldConfigs) { - AbstractFieldConfig newProtocolFieldConfig = protocolFieldConfigs.get(protocolFieldConfigs.size() - 1); + private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { + Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); Integer mergeBitToByte = 0; + mergeBitToByte += originPositionIndex; if (newProtocolFieldConfig.getOffsetUnit().equals("bit")) { mergeBitToByte += (newProtocolFieldConfig.getOriginPositionBit() + newProtocolFieldConfig.getOffsetLength()) / 8; } else { @@ -51,4 +58,21 @@ return mergeBitToByte; } + /** + * 获取,如果存在则进行数据的读取,如果不存在则进行深拷贝,重新复制 + */ + private Map getStoreObjectMap(int index, List> storeObjectList) { + Map storeObjectMap; + if (index <= (storeObjectList.size() - 1)) { + storeObjectMap = storeObjectList.get(index); + } else { + storeObjectMap = new HashMap<>(); + if (storeObjectList.size() != 0) { + storeObjectMap.putAll(storeObjectList.get(storeObjectList.size() - 1)); + } + storeObjectList.add(storeObjectMap); + } + return storeObjectMap; + } + } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 82b698e..d34c071 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 @@ -9,8 +9,11 @@ import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import org.springframework.beans.BeanUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author cz @@ -24,25 +27,29 @@ Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); - for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { - if (!ObjectUtils.isEmpty(abstractFieldConfig.getOriginPositionByte())) { - abstractFieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + abstractFieldConfig.getOriginPositionByte()); + Integer currentIndex = 0, fieldCurrent = 0; + while (fieldCurrent < combinedFieldParam.getTotalLength()) { + //先取,然后是创建 + Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); + for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { + fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - combinedFieldParam.getStoreObjectMap().put(abstractFieldConfig.getFieldName(), fieldValue); + storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(calculateProcessPosition(protocolFieldConfigs)); + combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); return null; } /** - * 计算处理位置 + * 计算处理后的偏移位置 */ - private Integer calculateProcessPosition(List protocolFieldConfigs) { - AbstractFieldConfig newProtocolFieldConfig = protocolFieldConfigs.get(protocolFieldConfigs.size() - 1); + private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { + Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); Integer mergeBitToByte = 0; + mergeBitToByte += originPositionIndex; if (newProtocolFieldConfig.getOffsetUnit().equals("bit")) { mergeBitToByte += (newProtocolFieldConfig.getOriginPositionBit() + newProtocolFieldConfig.getOffsetLength()) / 8; } else { @@ -51,4 +58,21 @@ return mergeBitToByte; } + /** + * 获取,如果存在则进行数据的读取,如果不存在则进行深拷贝,重新复制 + */ + private Map getStoreObjectMap(int index, List> storeObjectList) { + Map storeObjectMap; + if (index <= (storeObjectList.size() - 1)) { + storeObjectMap = storeObjectList.get(index); + } else { + storeObjectMap = new HashMap<>(); + if (storeObjectList.size() != 0) { + storeObjectMap.putAll(storeObjectList.get(storeObjectList.size() - 1)); + } + storeObjectList.add(storeObjectMap); + } + return storeObjectMap; + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index ca18ba1..2b9d635 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -1,6 +1,8 @@ package com.casic.missiles.parser.resolver.combined.impl; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; @@ -32,31 +34,28 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam.getFieldConfigsMap()); - Assert.isFalse(Objects.isNull(lengthConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); - //回填判断操作,只有一个配置 + combinedFieldParam.setTotalLength(fieldValue); + //设置回填默认值判断操作,只有一个配置 if (dataFieldIds.length == 1) { FieldConfig fieldConfig = getFieldConfigById(Long.valueOf(dataFieldIds[0]), combinedFieldParam.getFieldConfigsMap()); - if (fieldConfig == null) { - return null; - } - fieldConfig.setOffsetLength(fieldValue); - fieldConfig.setIsStorage(combinedFieldConfig.getIsStorge()); - fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); + Assert.isFalse(Objects.isNull(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); + }); + fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); + fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); + fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; - } else if (dataFieldIds.length > 1) {//含有多个字段的操作 - fieldConfigs =getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(),combinedFieldParam.getFieldConfigsMap()); + fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 82b698e..d34c071 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 @@ -9,8 +9,11 @@ import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import org.springframework.beans.BeanUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author cz @@ -24,25 +27,29 @@ Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); - for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { - if (!ObjectUtils.isEmpty(abstractFieldConfig.getOriginPositionByte())) { - abstractFieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + abstractFieldConfig.getOriginPositionByte()); + Integer currentIndex = 0, fieldCurrent = 0; + while (fieldCurrent < combinedFieldParam.getTotalLength()) { + //先取,然后是创建 + Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); + for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { + fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - combinedFieldParam.getStoreObjectMap().put(abstractFieldConfig.getFieldName(), fieldValue); + storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(calculateProcessPosition(protocolFieldConfigs)); + combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); return null; } /** - * 计算处理位置 + * 计算处理后的偏移位置 */ - private Integer calculateProcessPosition(List protocolFieldConfigs) { - AbstractFieldConfig newProtocolFieldConfig = protocolFieldConfigs.get(protocolFieldConfigs.size() - 1); + private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { + Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); Integer mergeBitToByte = 0; + mergeBitToByte += originPositionIndex; if (newProtocolFieldConfig.getOffsetUnit().equals("bit")) { mergeBitToByte += (newProtocolFieldConfig.getOriginPositionBit() + newProtocolFieldConfig.getOffsetLength()) / 8; } else { @@ -51,4 +58,21 @@ return mergeBitToByte; } + /** + * 获取,如果存在则进行数据的读取,如果不存在则进行深拷贝,重新复制 + */ + private Map getStoreObjectMap(int index, List> storeObjectList) { + Map storeObjectMap; + if (index <= (storeObjectList.size() - 1)) { + storeObjectMap = storeObjectList.get(index); + } else { + storeObjectMap = new HashMap<>(); + if (storeObjectList.size() != 0) { + storeObjectMap.putAll(storeObjectList.get(storeObjectList.size() - 1)); + } + storeObjectList.add(storeObjectMap); + } + return storeObjectMap; + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index ca18ba1..2b9d635 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -1,6 +1,8 @@ package com.casic.missiles.parser.resolver.combined.impl; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; @@ -32,31 +34,28 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam.getFieldConfigsMap()); - Assert.isFalse(Objects.isNull(lengthConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); - //回填判断操作,只有一个配置 + combinedFieldParam.setTotalLength(fieldValue); + //设置回填默认值判断操作,只有一个配置 if (dataFieldIds.length == 1) { FieldConfig fieldConfig = getFieldConfigById(Long.valueOf(dataFieldIds[0]), combinedFieldParam.getFieldConfigsMap()); - if (fieldConfig == null) { - return null; - } - fieldConfig.setOffsetLength(fieldValue); - fieldConfig.setIsStorage(combinedFieldConfig.getIsStorge()); - fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); + Assert.isFalse(Objects.isNull(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); + }); + fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); + fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); + fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; - } else if (dataFieldIds.length > 1) {//含有多个字段的操作 - fieldConfigs =getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(),combinedFieldParam.getFieldConfigsMap()); + fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; } } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index 4756502..2529b47 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser.resolver.combined.impl; -import cn.hutool.core.lang.Assert; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; +import com.casic.missiles.enums.PreLeadCodeParseStatus; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; import com.casic.missiles.parser.resolver.combined.CombinedFieldSupport; @@ -20,7 +17,7 @@ * @author cz * @date 2023-6-13 */ -public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { +public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 @@ -32,26 +29,51 @@ System.out.println(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), combinedFieldParam.getByteBuf()); - resolvePreCode(combinedFieldParam, combinedFieldConfig); - Assert.isFalse(ObjectUtils.isEmpty(combinedFieldConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_PRE_CODE_FIELD_NULL); - }); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); + if (executeResult == CONFIGURE_NULL) { + //前导没有解析成功,前导码配置为空,前导码配置错误 + if (ObjectUtils.isEmpty(combinedFieldConfig) + || StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()) + || ObjectUtils.isEmpty(combinedFieldConfig.getDynamicLengthId())) { + skipNotConfigPreCode(combinedFieldParam); + } + } else if (executeResult == NOT_PARSE) { + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + } return combinedFieldConfig; } /** * 如果前导码需要解析,则进行前导码的解析 */ - private void resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { + private Integer resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { //如果前导码组合字段不为空 + if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return CONFIGURE_NULL; + } if (StringUtils.isEmpty(combinedFieldConfig.getCombinedFieldIds())) { - return; + return NOT_PARSE; } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); + combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); + return ALREADY_PARSE; } + + private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); + combinedFieldParam.getByteBuf().readBytes(fieldValue); + if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + return; + } + this.invoke(combinedFieldParam); + } + + } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 82b698e..d34c071 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 @@ -9,8 +9,11 @@ import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import org.springframework.beans.BeanUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author cz @@ -24,25 +27,29 @@ Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); - for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { - if (!ObjectUtils.isEmpty(abstractFieldConfig.getOriginPositionByte())) { - abstractFieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + abstractFieldConfig.getOriginPositionByte()); + Integer currentIndex = 0, fieldCurrent = 0; + while (fieldCurrent < combinedFieldParam.getTotalLength()) { + //先取,然后是创建 + Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); + for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { + fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - combinedFieldParam.getStoreObjectMap().put(abstractFieldConfig.getFieldName(), fieldValue); + storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(calculateProcessPosition(protocolFieldConfigs)); + combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); return null; } /** - * 计算处理位置 + * 计算处理后的偏移位置 */ - private Integer calculateProcessPosition(List protocolFieldConfigs) { - AbstractFieldConfig newProtocolFieldConfig = protocolFieldConfigs.get(protocolFieldConfigs.size() - 1); + private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { + Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); Integer mergeBitToByte = 0; + mergeBitToByte += originPositionIndex; if (newProtocolFieldConfig.getOffsetUnit().equals("bit")) { mergeBitToByte += (newProtocolFieldConfig.getOriginPositionBit() + newProtocolFieldConfig.getOffsetLength()) / 8; } else { @@ -51,4 +58,21 @@ return mergeBitToByte; } + /** + * 获取,如果存在则进行数据的读取,如果不存在则进行深拷贝,重新复制 + */ + private Map getStoreObjectMap(int index, List> storeObjectList) { + Map storeObjectMap; + if (index <= (storeObjectList.size() - 1)) { + storeObjectMap = storeObjectList.get(index); + } else { + storeObjectMap = new HashMap<>(); + if (storeObjectList.size() != 0) { + storeObjectMap.putAll(storeObjectList.get(storeObjectList.size() - 1)); + } + storeObjectList.add(storeObjectMap); + } + return storeObjectMap; + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index ca18ba1..2b9d635 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -1,6 +1,8 @@ package com.casic.missiles.parser.resolver.combined.impl; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; @@ -32,31 +34,28 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam.getFieldConfigsMap()); - Assert.isFalse(Objects.isNull(lengthConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); - //回填判断操作,只有一个配置 + combinedFieldParam.setTotalLength(fieldValue); + //设置回填默认值判断操作,只有一个配置 if (dataFieldIds.length == 1) { FieldConfig fieldConfig = getFieldConfigById(Long.valueOf(dataFieldIds[0]), combinedFieldParam.getFieldConfigsMap()); - if (fieldConfig == null) { - return null; - } - fieldConfig.setOffsetLength(fieldValue); - fieldConfig.setIsStorage(combinedFieldConfig.getIsStorge()); - fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); + Assert.isFalse(Objects.isNull(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); + }); + fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); + fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); + fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; - } else if (dataFieldIds.length > 1) {//含有多个字段的操作 - fieldConfigs =getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(),combinedFieldParam.getFieldConfigsMap()); + fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; } } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index 4756502..2529b47 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser.resolver.combined.impl; -import cn.hutool.core.lang.Assert; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; +import com.casic.missiles.enums.PreLeadCodeParseStatus; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; import com.casic.missiles.parser.resolver.combined.CombinedFieldSupport; @@ -20,7 +17,7 @@ * @author cz * @date 2023-6-13 */ -public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { +public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 @@ -32,26 +29,51 @@ System.out.println(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), combinedFieldParam.getByteBuf()); - resolvePreCode(combinedFieldParam, combinedFieldConfig); - Assert.isFalse(ObjectUtils.isEmpty(combinedFieldConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_PRE_CODE_FIELD_NULL); - }); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); + if (executeResult == CONFIGURE_NULL) { + //前导没有解析成功,前导码配置为空,前导码配置错误 + if (ObjectUtils.isEmpty(combinedFieldConfig) + || StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()) + || ObjectUtils.isEmpty(combinedFieldConfig.getDynamicLengthId())) { + skipNotConfigPreCode(combinedFieldParam); + } + } else if (executeResult == NOT_PARSE) { + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + } return combinedFieldConfig; } /** * 如果前导码需要解析,则进行前导码的解析 */ - private void resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { + private Integer resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { //如果前导码组合字段不为空 + if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return CONFIGURE_NULL; + } if (StringUtils.isEmpty(combinedFieldConfig.getCombinedFieldIds())) { - return; + return NOT_PARSE; } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); + combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); + return ALREADY_PARSE; } + + private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); + combinedFieldParam.getByteBuf().readBytes(fieldValue); + if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + return; + } + this.invoke(combinedFieldParam); + } + + } 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 11c5d64..5a4b3c0 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 @@ -41,10 +41,10 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(byteBuf.readerIndex() + originPosition + visitIndex); - binaryStr = binaryStr + getBinaryStrFromByte(fields); + fields = byteBuf.getByte(originPosition + visitIndex); + binaryStr = getBinaryStrFromByte(fields) + binaryStr; } - binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() +fieldConfig.getOffsetLength()); + binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); fieldValue = Integer.parseInt(binaryStr, 2); if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { return fieldValue; 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 82b698e..d34c071 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 @@ -9,8 +9,11 @@ import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import org.springframework.beans.BeanUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author cz @@ -24,25 +27,29 @@ Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); - for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { - if (!ObjectUtils.isEmpty(abstractFieldConfig.getOriginPositionByte())) { - abstractFieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + abstractFieldConfig.getOriginPositionByte()); + Integer currentIndex = 0, fieldCurrent = 0; + while (fieldCurrent < combinedFieldParam.getTotalLength()) { + //先取,然后是创建 + Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); + for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { + fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - combinedFieldParam.getStoreObjectMap().put(abstractFieldConfig.getFieldName(), fieldValue); + storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(calculateProcessPosition(protocolFieldConfigs)); + combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); return null; } /** - * 计算处理位置 + * 计算处理后的偏移位置 */ - private Integer calculateProcessPosition(List protocolFieldConfigs) { - AbstractFieldConfig newProtocolFieldConfig = protocolFieldConfigs.get(protocolFieldConfigs.size() - 1); + private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { + Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); Integer mergeBitToByte = 0; + mergeBitToByte += originPositionIndex; if (newProtocolFieldConfig.getOffsetUnit().equals("bit")) { mergeBitToByte += (newProtocolFieldConfig.getOriginPositionBit() + newProtocolFieldConfig.getOffsetLength()) / 8; } else { @@ -51,4 +58,21 @@ return mergeBitToByte; } + /** + * 获取,如果存在则进行数据的读取,如果不存在则进行深拷贝,重新复制 + */ + private Map getStoreObjectMap(int index, List> storeObjectList) { + Map storeObjectMap; + if (index <= (storeObjectList.size() - 1)) { + storeObjectMap = storeObjectList.get(index); + } else { + storeObjectMap = new HashMap<>(); + if (storeObjectList.size() != 0) { + storeObjectMap.putAll(storeObjectList.get(storeObjectList.size() - 1)); + } + storeObjectList.add(storeObjectMap); + } + return storeObjectMap; + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index ca18ba1..2b9d635 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -1,6 +1,8 @@ package com.casic.missiles.parser.resolver.combined.impl; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; @@ -32,31 +34,28 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam.getFieldConfigsMap()); - Assert.isFalse(Objects.isNull(lengthConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); - //回填判断操作,只有一个配置 + combinedFieldParam.setTotalLength(fieldValue); + //设置回填默认值判断操作,只有一个配置 if (dataFieldIds.length == 1) { FieldConfig fieldConfig = getFieldConfigById(Long.valueOf(dataFieldIds[0]), combinedFieldParam.getFieldConfigsMap()); - if (fieldConfig == null) { - return null; - } - fieldConfig.setOffsetLength(fieldValue); - fieldConfig.setIsStorage(combinedFieldConfig.getIsStorge()); - fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); + Assert.isFalse(Objects.isNull(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); + }); + fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); + fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); + fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; - } else if (dataFieldIds.length > 1) {//含有多个字段的操作 - fieldConfigs =getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(),combinedFieldParam.getFieldConfigsMap()); + fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; } } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index 4756502..2529b47 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser.resolver.combined.impl; -import cn.hutool.core.lang.Assert; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; +import com.casic.missiles.enums.PreLeadCodeParseStatus; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; import com.casic.missiles.parser.resolver.combined.CombinedFieldSupport; @@ -20,7 +17,7 @@ * @author cz * @date 2023-6-13 */ -public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { +public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 @@ -32,26 +29,51 @@ System.out.println(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), combinedFieldParam.getByteBuf()); - resolvePreCode(combinedFieldParam, combinedFieldConfig); - Assert.isFalse(ObjectUtils.isEmpty(combinedFieldConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_PRE_CODE_FIELD_NULL); - }); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); + if (executeResult == CONFIGURE_NULL) { + //前导没有解析成功,前导码配置为空,前导码配置错误 + if (ObjectUtils.isEmpty(combinedFieldConfig) + || StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()) + || ObjectUtils.isEmpty(combinedFieldConfig.getDynamicLengthId())) { + skipNotConfigPreCode(combinedFieldParam); + } + } else if (executeResult == NOT_PARSE) { + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + } return combinedFieldConfig; } /** * 如果前导码需要解析,则进行前导码的解析 */ - private void resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { + private Integer resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { //如果前导码组合字段不为空 + if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return CONFIGURE_NULL; + } if (StringUtils.isEmpty(combinedFieldConfig.getCombinedFieldIds())) { - return; + return NOT_PARSE; } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); + combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); + return ALREADY_PARSE; } + + private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); + combinedFieldParam.getByteBuf().readBytes(fieldValue); + if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + return; + } + this.invoke(combinedFieldParam); + } + + } 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 11c5d64..5a4b3c0 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 @@ -41,10 +41,10 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(byteBuf.readerIndex() + originPosition + visitIndex); - binaryStr = binaryStr + getBinaryStrFromByte(fields); + fields = byteBuf.getByte(originPosition + visitIndex); + binaryStr = getBinaryStrFromByte(fields) + binaryStr; } - binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() +fieldConfig.getOffsetLength()); + binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); fieldValue = Integer.parseInt(binaryStr, 2); if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { return fieldValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 35819d5..6718231 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Data; +import java.util.List; import java.util.Map; /** @@ -32,6 +33,13 @@ /** * 解析字段储存map */ - private Map storeObjectMap; + private List> storeObjectList; + + + /** + * 解析字段储存map + */ + private Integer totalLength; + } 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 82b698e..d34c071 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 @@ -9,8 +9,11 @@ import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import org.springframework.beans.BeanUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author cz @@ -24,25 +27,29 @@ Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); - for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { - if (!ObjectUtils.isEmpty(abstractFieldConfig.getOriginPositionByte())) { - abstractFieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + abstractFieldConfig.getOriginPositionByte()); + Integer currentIndex = 0, fieldCurrent = 0; + while (fieldCurrent < combinedFieldParam.getTotalLength()) { + //先取,然后是创建 + Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); + for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { + fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - combinedFieldParam.getStoreObjectMap().put(abstractFieldConfig.getFieldName(), fieldValue); + storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(calculateProcessPosition(protocolFieldConfigs)); + combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); return null; } /** - * 计算处理位置 + * 计算处理后的偏移位置 */ - private Integer calculateProcessPosition(List protocolFieldConfigs) { - AbstractFieldConfig newProtocolFieldConfig = protocolFieldConfigs.get(protocolFieldConfigs.size() - 1); + private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { + Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); Integer mergeBitToByte = 0; + mergeBitToByte += originPositionIndex; if (newProtocolFieldConfig.getOffsetUnit().equals("bit")) { mergeBitToByte += (newProtocolFieldConfig.getOriginPositionBit() + newProtocolFieldConfig.getOffsetLength()) / 8; } else { @@ -51,4 +58,21 @@ return mergeBitToByte; } + /** + * 获取,如果存在则进行数据的读取,如果不存在则进行深拷贝,重新复制 + */ + private Map getStoreObjectMap(int index, List> storeObjectList) { + Map storeObjectMap; + if (index <= (storeObjectList.size() - 1)) { + storeObjectMap = storeObjectList.get(index); + } else { + storeObjectMap = new HashMap<>(); + if (storeObjectList.size() != 0) { + storeObjectMap.putAll(storeObjectList.get(storeObjectList.size() - 1)); + } + storeObjectList.add(storeObjectMap); + } + return storeObjectMap; + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index ca18ba1..2b9d635 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -1,6 +1,8 @@ package com.casic.missiles.parser.resolver.combined.impl; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; @@ -32,31 +34,28 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam.getFieldConfigsMap()); - Assert.isFalse(Objects.isNull(lengthConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); - //回填判断操作,只有一个配置 + combinedFieldParam.setTotalLength(fieldValue); + //设置回填默认值判断操作,只有一个配置 if (dataFieldIds.length == 1) { FieldConfig fieldConfig = getFieldConfigById(Long.valueOf(dataFieldIds[0]), combinedFieldParam.getFieldConfigsMap()); - if (fieldConfig == null) { - return null; - } - fieldConfig.setOffsetLength(fieldValue); - fieldConfig.setIsStorage(combinedFieldConfig.getIsStorge()); - fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); + Assert.isFalse(Objects.isNull(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); + }); + fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); + fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); + fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; - } else if (dataFieldIds.length > 1) {//含有多个字段的操作 - fieldConfigs =getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(),combinedFieldParam.getFieldConfigsMap()); + fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; } } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index 4756502..2529b47 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser.resolver.combined.impl; -import cn.hutool.core.lang.Assert; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; +import com.casic.missiles.enums.PreLeadCodeParseStatus; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; import com.casic.missiles.parser.resolver.combined.CombinedFieldSupport; @@ -20,7 +17,7 @@ * @author cz * @date 2023-6-13 */ -public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { +public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 @@ -32,26 +29,51 @@ System.out.println(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), combinedFieldParam.getByteBuf()); - resolvePreCode(combinedFieldParam, combinedFieldConfig); - Assert.isFalse(ObjectUtils.isEmpty(combinedFieldConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_PRE_CODE_FIELD_NULL); - }); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); + if (executeResult == CONFIGURE_NULL) { + //前导没有解析成功,前导码配置为空,前导码配置错误 + if (ObjectUtils.isEmpty(combinedFieldConfig) + || StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()) + || ObjectUtils.isEmpty(combinedFieldConfig.getDynamicLengthId())) { + skipNotConfigPreCode(combinedFieldParam); + } + } else if (executeResult == NOT_PARSE) { + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + } return combinedFieldConfig; } /** * 如果前导码需要解析,则进行前导码的解析 */ - private void resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { + private Integer resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { //如果前导码组合字段不为空 + if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return CONFIGURE_NULL; + } if (StringUtils.isEmpty(combinedFieldConfig.getCombinedFieldIds())) { - return; + return NOT_PARSE; } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); + combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); + return ALREADY_PARSE; } + + private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); + combinedFieldParam.getByteBuf().readBytes(fieldValue); + if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + return; + } + this.invoke(combinedFieldParam); + } + + } 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 11c5d64..5a4b3c0 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 @@ -41,10 +41,10 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(byteBuf.readerIndex() + originPosition + visitIndex); - binaryStr = binaryStr + getBinaryStrFromByte(fields); + fields = byteBuf.getByte(originPosition + visitIndex); + binaryStr = getBinaryStrFromByte(fields) + binaryStr; } - binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() +fieldConfig.getOffsetLength()); + binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); fieldValue = Integer.parseInt(binaryStr, 2); if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { return fieldValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 35819d5..6718231 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Data; +import java.util.List; import java.util.Map; /** @@ -32,6 +33,13 @@ /** * 解析字段储存map */ - private Map storeObjectMap; + private List> storeObjectList; + + + /** + * 解析字段储存map + */ + private Integer totalLength; + } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/PreLeadCodeParseStatus.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/PreLeadCodeParseStatus.java new file mode 100644 index 0000000..8e69e9d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/PreLeadCodeParseStatus.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums; + +public interface PreLeadCodeParseStatus { + + int CONFIGURE_NULL = 0; + + int NOT_PARSE = 2; + + int ALREADY_PARSE = 0; + +} 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 1c68e1a..ceb877a 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,5 +1,6 @@ package com.casic.missiles.parser; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; @@ -16,8 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,7 +67,7 @@ //获取报文的业务内容 wholePlainBuf = protocolFactory.getProtocolFieldConfigProvider().createDataContentBuf(clearZeroPlainBuf); } - ByteBuf wholeNewPlainBuf=null; + ByteBuf wholeNewPlainBuf = null; //通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 @@ -82,7 +85,7 @@ //解析单个业务字段 ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); //构建发送解析任务 - Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); + List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 datagramEventProvider.storeData(bizDataMap); return true; @@ -130,15 +133,22 @@ } //数据构建,获取固定字段的store和业务字段store - private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { - Map bizDataMap = new HashMap<>(); + private List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + List> bizDataMap = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); - Map combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); + List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(ruleStoreObjectMap); - bizDataMap.putAll(protocolStoreObjectMap); - bizDataMap.putAll(combinedStoreObjectMap); + if(!CollectionUtils.isEmpty(ruleStoreObjectMap)){ + bizDataMap.add(ruleStoreObjectMap); + } + if(!CollectionUtils.isEmpty(protocolStoreObjectMap)){ + bizDataMap.add(protocolStoreObjectMap); + } + if(!CollectionUtils.isEmpty(combinedStoreObjectMap)){ + bizDataMap.addAll(combinedStoreObjectMap); + } + System.out.println(JSONObject.toJSON(bizDataMap)); return bizDataMap; } 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 8228273..b017d9a 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 @@ -6,6 +6,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -50,6 +51,19 @@ return null; } + /** 默认获取其中使用最多的长度Id + * 1、统计最多长度配置 + * 2、随机选取配置最多的配置 + */ + public static CombinedFieldConfig defaultFieldLeadingCode(Map fieldFixedMap) { + Set> en = fieldFixedMap.entrySet(); + for (Map.Entry entry : en) { + return entry.getValue(); + } + //匹配失败 + return null; + } + /** * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java index d18759f..3304a4a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,9 +24,9 @@ * 作为临时配置列表缓存使用 */ private final List combinedFieldConfigList; - private Map storeObjectMap = new HashMap<>(); + private List> storeObjectMap = new ArrayList<>(); - public Map getStoreObjectMap() { + public List> getStoreObjectMap() { return storeObjectMap; } @@ -39,7 +40,7 @@ return; } byteBuf.resetReaderIndex(); - List ruleCombinedConfigList=this.prepareParseField(ruleConfig); + List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java index 9a63bf4..bddb610 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -45,11 +45,12 @@ if (showSkip()) { return null; } + byteBuf.resetReaderIndex(); List prepareFieldConfig = prepareParseField(ruleConfig); if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java index b996e72..2b07653 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProcessorInstanceProvider.java @@ -64,7 +64,7 @@ } //数据发送,数据发送者暂未构建 - public void storeData(Map bizDataMap) { + public void storeData(List> bizDataMap) { DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); // dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java index a8212a6..d93c382 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/CombinedFieldSupport.java @@ -1,15 +1,21 @@ package com.casic.missiles.parser.resolver.combined; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.EngineExceptionEnum; +import com.casic.missiles.exception.EngineException; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Map; +import java.util.Objects; /** * @author cz - * */ public class CombinedFieldSupport { @@ -26,6 +32,23 @@ } } + /** + * 通过配置获取长度的值,且计算 + * @param dynamicLengthId + * @param combinedFieldParam + * @return + */ + protected Integer getLengthFieldValue(Long dynamicLengthId, CombinedFieldProcessorParam combinedFieldParam) { + FieldConfig lengthConfig = getFieldConfigById(dynamicLengthId, combinedFieldParam.getFieldConfigsMap()); + Assert.isFalse(Objects.isNull(lengthConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + return fieldValue; + } + //通过strIds获取对应的config配置 protected ArrayList getFieldConfigByIds(String combinedFieldIds, Map fieldConfigsMap) { ArrayList fieldConfigs = new ArrayList<>(); 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 2170bb5..020e0cd 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 @@ -10,6 +10,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -24,23 +25,19 @@ @Slf4j public class GenericCombinedFieldResolver { - //前导码失败或者读位置移到空位置 - //通过查询,字段长度长度随机 public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - Map storeObjectMap, Map fieldConfigsMap) { - final Integer frameLength = ByteBufUtil.hexDump(byteBuf).length() / 2; + List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); Object median = null; List abstractProcessorList = CreateSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectMap); - //frameLength - while (byteBuf.readerIndex() < frameLength) { + CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { Integer oldLength = byteBuf.readerIndex(); median = abstractProcessor.invoke(combinedFieldParam); - if (byteBuf.readerIndex() >= frameLength) { + if (byteBuf.readerIndex() >= byteBuf.writerIndex()) { return; } if (oldLength == byteBuf.readerIndex()) { @@ -54,7 +51,10 @@ } } } - System.out.println(JSON.toJSON(storeObjectMap)); + if (!CollectionUtils.isEmpty(storeObjectList)) { + storeObjectList.stream(); + } + System.out.println(JSON.toJSON(storeObjectList)); } /** @@ -73,11 +73,11 @@ private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, Map storeObjectMap) { + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) - .storeObjectMap(storeObjectMap) + .storeObjectList(storeObjectMap) .fieldFixedMap(fieldFixedMap) .build(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/BizFieldParseProcessor.java index 82b698e..d34c071 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 @@ -9,8 +9,11 @@ import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; +import org.springframework.beans.BeanUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author cz @@ -24,25 +27,29 @@ Assert.isFalse(CollectionUtils.isEmpty(protocolFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); - for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { - if (!ObjectUtils.isEmpty(abstractFieldConfig.getOriginPositionByte())) { - abstractFieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + abstractFieldConfig.getOriginPositionByte()); + Integer currentIndex = 0, fieldCurrent = 0; + while (fieldCurrent < combinedFieldParam.getTotalLength()) { + //先取,然后是创建 + Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); + for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { + fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { - combinedFieldParam.getStoreObjectMap().put(abstractFieldConfig.getFieldName(), fieldValue); + storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } } } - combinedFieldParam.getByteBuf().readBytes(calculateProcessPosition(protocolFieldConfigs)); + combinedFieldParam.getByteBuf().readBytes(combinedFieldParam.getTotalLength()); return null; } /** - * 计算处理位置 + * 计算处理后的偏移位置 */ - private Integer calculateProcessPosition(List protocolFieldConfigs) { - AbstractFieldConfig newProtocolFieldConfig = protocolFieldConfigs.get(protocolFieldConfigs.size() - 1); + private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { + Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); Integer mergeBitToByte = 0; + mergeBitToByte += originPositionIndex; if (newProtocolFieldConfig.getOffsetUnit().equals("bit")) { mergeBitToByte += (newProtocolFieldConfig.getOriginPositionBit() + newProtocolFieldConfig.getOffsetLength()) / 8; } else { @@ -51,4 +58,21 @@ return mergeBitToByte; } + /** + * 获取,如果存在则进行数据的读取,如果不存在则进行深拷贝,重新复制 + */ + private Map getStoreObjectMap(int index, List> storeObjectList) { + Map storeObjectMap; + if (index <= (storeObjectList.size() - 1)) { + storeObjectMap = storeObjectList.get(index); + } else { + storeObjectMap = new HashMap<>(); + if (storeObjectList.size() != 0) { + storeObjectMap.putAll(storeObjectList.get(storeObjectList.size() - 1)); + } + storeObjectList.add(storeObjectMap); + } + return storeObjectMap; + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java index ca18ba1..2b9d635 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreBizFieldParseProcessor.java @@ -1,6 +1,8 @@ package com.casic.missiles.parser.resolver.combined.impl; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.enums.EngineExceptionEnum; import com.casic.missiles.exception.EngineException; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; @@ -32,31 +34,28 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - FieldConfig lengthConfig = getFieldConfigById(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam.getFieldConfigsMap()); - Assert.isFalse(Objects.isNull(lengthConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); - combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); - //回填判断操作,只有一个配置 + combinedFieldParam.setTotalLength(fieldValue); + //设置回填默认值判断操作,只有一个配置 if (dataFieldIds.length == 1) { FieldConfig fieldConfig = getFieldConfigById(Long.valueOf(dataFieldIds[0]), combinedFieldParam.getFieldConfigsMap()); - if (fieldConfig == null) { - return null; - } - fieldConfig.setOffsetLength(fieldValue); - fieldConfig.setIsStorage(combinedFieldConfig.getIsStorge()); - fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); + Assert.isFalse(Objects.isNull(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); + }); + fieldConfig.setOffsetLength(ObjectUtils.isEmpty(fieldConfig.getOffsetLength()) || fieldConfig.getOffsetLength() == 0 ? fieldValue : fieldConfig.getOffsetLength()); + fieldConfig.setIsStorage(ObjectUtils.isEmpty(fieldConfig.getIsStorage()) ? combinedFieldConfig.getIsStorge() : fieldConfig.getIsStorage()); + fieldConfig.setFieldName(StringUtils.isEmpty(fieldConfig.getFieldName()) ? combinedFieldConfig.getDataFieldName() : fieldConfig.getFieldName()); + fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte()); fieldConfigs.add(fieldConfig); return fieldConfigs; - } else if (dataFieldIds.length > 1) {//含有多个字段的操作 - fieldConfigs =getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(),combinedFieldParam.getFieldConfigsMap()); + fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getDataFieldIds(), combinedFieldParam.getFieldConfigsMap()); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); return fieldConfigs; } else { return null; } } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java index 4756502..2529b47 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/impl/PreLeadCodeProcessor.java @@ -1,10 +1,7 @@ package com.casic.missiles.parser.resolver.combined.impl; -import cn.hutool.core.lang.Assert; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; -import com.casic.missiles.enums.EngineExceptionEnum; -import com.casic.missiles.exception.EngineException; +import com.casic.missiles.enums.PreLeadCodeParseStatus; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; import com.casic.missiles.parser.resolver.combined.AbstractCombinedFieldProcessor; import com.casic.missiles.parser.resolver.combined.CombinedFieldSupport; @@ -20,7 +17,7 @@ * @author cz * @date 2023-6-13 */ -public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { +public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 @@ -32,26 +29,51 @@ System.out.println(ByteBufUtil.hexDump(combinedFieldParam.getByteBuf())); CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.matchFieldLeadingCode(combinedFieldParam.getFieldFixedMap(), combinedFieldParam.getByteBuf()); - resolvePreCode(combinedFieldParam, combinedFieldConfig); - Assert.isFalse(ObjectUtils.isEmpty(combinedFieldConfig), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_PRE_CODE_FIELD_NULL); - }); - combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + int executeResult = resolvePreCode(combinedFieldParam, combinedFieldConfig); + if (executeResult == CONFIGURE_NULL) { + //前导没有解析成功,前导码配置为空,前导码配置错误 + if (ObjectUtils.isEmpty(combinedFieldConfig) + || StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()) + || ObjectUtils.isEmpty(combinedFieldConfig.getDynamicLengthId())) { + skipNotConfigPreCode(combinedFieldParam); + } + } else if (executeResult == NOT_PARSE) { + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + } return combinedFieldConfig; } /** * 如果前导码需要解析,则进行前导码的解析 */ - private void resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { + private Integer resolvePreCode(CombinedFieldProcessorParam combinedFieldParam, CombinedFieldConfig combinedFieldConfig) { //如果前导码组合字段不为空 + if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return CONFIGURE_NULL; + } if (StringUtils.isEmpty(combinedFieldConfig.getCombinedFieldIds())) { - return; + return NOT_PARSE; } ArrayList fieldConfigs = getFieldConfigByIds(combinedFieldConfig.getCombinedFieldIds(), combinedFieldParam.getFieldConfigsMap()); + combinedFieldParam.setTotalLength(combinedFieldConfig.getPrefixCode().length() / 2); + fieldConfigs.forEach(fieldConfig -> fieldConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + fieldConfig.getOriginPositionByte())); combinedFieldParam.setPreProcessorResult(fieldConfigs); AbstractCombinedFieldProcessor combinedFieldProcessor = new BizFieldParseProcessor(); combinedFieldProcessor.invoke(combinedFieldParam); + return ALREADY_PARSE; } + + private void skipNotConfigPreCode(CombinedFieldProcessorParam combinedFieldParam) { + CombinedFieldConfig combinedFieldConfig = LeadingCodeMatcher.defaultFieldLeadingCode(combinedFieldParam.getFieldFixedMap()); + combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); + combinedFieldParam.getByteBuf().readBytes(fieldValue); + if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + return; + } + this.invoke(combinedFieldParam); + } + + } 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 11c5d64..5a4b3c0 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 @@ -41,10 +41,10 @@ String binaryStr = ""; //下标是由0开始,所以先- while (--visitIndex > -1) { - fields = byteBuf.getByte(byteBuf.readerIndex() + originPosition + visitIndex); - binaryStr = binaryStr + getBinaryStrFromByte(fields); + fields = byteBuf.getByte(originPosition + visitIndex); + binaryStr = getBinaryStrFromByte(fields) + binaryStr; } - binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() +fieldConfig.getOffsetLength()); + binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); fieldValue = Integer.parseInt(binaryStr, 2); if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { return fieldValue; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 35819d5..6718231 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Data; +import java.util.List; import java.util.Map; /** @@ -32,6 +33,13 @@ /** * 解析字段储存map */ - private Map storeObjectMap; + private List> storeObjectList; + + + /** + * 解析字段储存map + */ + private Integer totalLength; + } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/PreLeadCodeParseStatus.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/PreLeadCodeParseStatus.java new file mode 100644 index 0000000..8e69e9d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/PreLeadCodeParseStatus.java @@ -0,0 +1,11 @@ +package com.casic.missiles.enums; + +public interface PreLeadCodeParseStatus { + + int CONFIGURE_NULL = 0; + + int NOT_PARSE = 2; + + int ALREADY_PARSE = 0; + +} 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 6e8d31d..4886e8b 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 @@ -1,5 +1,6 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; @Data @@ -24,6 +25,12 @@ * 偏移长度 */ private Integer offsetLength; + + /** + * 偏移长度 + */ + @TableField(exist = false) + private Integer totalLength; /** * 偏移单位(bit/byte) */