diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + if (combinedFieldParam.getByteBuf().writerIndex() == combinedFieldParam.getByteBuf().readerIndex()) { return; } this.invoke(combinedFieldParam); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index 29ede5e..d7e178d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -18,6 +18,13 @@ @Slf4j public class BitFieldDecorator { + /** + * todo: 构建bitBuf + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { Object fieldValue = new Object(); try { @@ -71,7 +78,7 @@ } /** - * 把byte转化成2进制字符串 + * todo: 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index 29ede5e..d7e178d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -18,6 +18,13 @@ @Slf4j public class BitFieldDecorator { + /** + * todo: 构建bitBuf + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { Object fieldValue = new Object(); try { @@ -71,7 +78,7 @@ } /** - * 把byte转化成2进制字符串 + * todo: 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 9b8c0aa..a4d8ebc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -19,7 +19,7 @@ public class ByteFieldDecorator { /** - * 定制化的和默认的 + * todo:定制化的和默认的byte回复报文构建 * * @param fieldConfig * @param currentConfigValue @@ -27,24 +27,36 @@ */ public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - customizeDecorator(fieldConfig,currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); } } - private static void defaultDecorator(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + + /** + * todo: 默认byte构建修饰器 + * + * @param fieldConfig + * @param currentValue + * @param dynamicContent + */ + private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - if (currentValue instanceof Long) { - System.out.println("增添Long类别"); - } valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent); } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private static void customizeDecorator(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + /** + * todo: 定制化的byte报文构建修饰器 + * 1、执行前置规则处理 + * 2、调用默认的报文构建 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + * @param replyRuleExpression + */ + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { try { Map env2 = new HashMap(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -53,7 +65,7 @@ env2.put(targetStr, currentConfigValue); } currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index 29ede5e..d7e178d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -18,6 +18,13 @@ @Slf4j public class BitFieldDecorator { + /** + * todo: 构建bitBuf + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { Object fieldValue = new Object(); try { @@ -71,7 +78,7 @@ } /** - * 把byte转化成2进制字符串 + * todo: 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 9b8c0aa..a4d8ebc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -19,7 +19,7 @@ public class ByteFieldDecorator { /** - * 定制化的和默认的 + * todo:定制化的和默认的byte回复报文构建 * * @param fieldConfig * @param currentConfigValue @@ -27,24 +27,36 @@ */ public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - customizeDecorator(fieldConfig,currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); } } - private static void defaultDecorator(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + + /** + * todo: 默认byte构建修饰器 + * + * @param fieldConfig + * @param currentValue + * @param dynamicContent + */ + private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - if (currentValue instanceof Long) { - System.out.println("增添Long类别"); - } valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent); } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private static void customizeDecorator(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + /** + * todo: 定制化的byte报文构建修饰器 + * 1、执行前置规则处理 + * 2、调用默认的报文构建 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + * @param replyRuleExpression + */ + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { try { Map env2 = new HashMap(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -53,7 +65,7 @@ env2.put(targetStr, currentConfigValue); } currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index 15cfd62..5f94b81 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -11,14 +11,37 @@ */ public class DefaultValueTypeResolver implements AbstractValueTypeResolver { + /** + * todo: 执行业务值得构建 + * 1、判断业务类型内容,执行类型转化为16进制的报文 + * 2、执行回复报文的构建 + * + * @param totalLength + * @param currentObjectValue + * @param byteBuf + */ @Override public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf) { - String currentValue = (String) currentObjectValue; + String hexStrValue = convertObjectToHexStr(currentObjectValue); + strToByteBuf(totalLength, hexStrValue, byteBuf); + } + + /** + * todo: 将str转化bytebuf + * + * @param totalLength 应填充的总长度 + * @param currentStrValue 待填充的字符串 + * @param byteBuf 待使用的bytebuf + */ + private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf) { byte[] keyBytes = null; Integer fillIndex = 0; - if (StringUtils.isNotEmpty(currentValue)) { - keyBytes = Hex.decode(currentValue); - fillIndex = currentValue.length() / 2; + if (StringUtils.isNotEmpty(currentStrValue)) { + if (currentStrValue.length() % 2 != 0) { + currentStrValue = "0" + currentStrValue; + } + keyBytes = Hex.decode(currentStrValue); + fillIndex = currentStrValue.length() / 2; } if (fillIndex != 0) { while (totalLength > fillIndex) { @@ -29,5 +52,36 @@ } } + /** + * todo:将对象转化16进制的字符串 + * + * @param currentObjectValue + * @return + */ + private String convertObjectToHexStr(Object currentObjectValue) { + String currentStrValue = ""; + if (currentObjectValue instanceof Long) { + currentStrValue = Long.toHexString((Long) currentObjectValue); + } + if (currentObjectValue instanceof Integer) { + currentStrValue = Integer.toHexString((Integer) currentObjectValue); + } + if (currentObjectValue instanceof Short) { + currentStrValue = Short.toString((Short) currentObjectValue); + } + if (currentObjectValue instanceof Float) { + currentStrValue = Float.toHexString((Float) currentObjectValue); + } + if (currentObjectValue instanceof Boolean) { + if ((Boolean) currentObjectValue) { + currentStrValue = "1"; + } else { + currentStrValue = "0"; + } + } else if (currentObjectValue instanceof String) { + currentStrValue = (String) currentObjectValue; + } -} + return currentStrValue; + } +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index 29ede5e..d7e178d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -18,6 +18,13 @@ @Slf4j public class BitFieldDecorator { + /** + * todo: 构建bitBuf + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { Object fieldValue = new Object(); try { @@ -71,7 +78,7 @@ } /** - * 把byte转化成2进制字符串 + * todo: 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 9b8c0aa..a4d8ebc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -19,7 +19,7 @@ public class ByteFieldDecorator { /** - * 定制化的和默认的 + * todo:定制化的和默认的byte回复报文构建 * * @param fieldConfig * @param currentConfigValue @@ -27,24 +27,36 @@ */ public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - customizeDecorator(fieldConfig,currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); } } - private static void defaultDecorator(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + + /** + * todo: 默认byte构建修饰器 + * + * @param fieldConfig + * @param currentValue + * @param dynamicContent + */ + private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - if (currentValue instanceof Long) { - System.out.println("增添Long类别"); - } valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent); } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private static void customizeDecorator(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + /** + * todo: 定制化的byte报文构建修饰器 + * 1、执行前置规则处理 + * 2、调用默认的报文构建 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + * @param replyRuleExpression + */ + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { try { Map env2 = new HashMap(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -53,7 +65,7 @@ env2.put(targetStr, currentConfigValue); } currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index 15cfd62..5f94b81 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -11,14 +11,37 @@ */ public class DefaultValueTypeResolver implements AbstractValueTypeResolver { + /** + * todo: 执行业务值得构建 + * 1、判断业务类型内容,执行类型转化为16进制的报文 + * 2、执行回复报文的构建 + * + * @param totalLength + * @param currentObjectValue + * @param byteBuf + */ @Override public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf) { - String currentValue = (String) currentObjectValue; + String hexStrValue = convertObjectToHexStr(currentObjectValue); + strToByteBuf(totalLength, hexStrValue, byteBuf); + } + + /** + * todo: 将str转化bytebuf + * + * @param totalLength 应填充的总长度 + * @param currentStrValue 待填充的字符串 + * @param byteBuf 待使用的bytebuf + */ + private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf) { byte[] keyBytes = null; Integer fillIndex = 0; - if (StringUtils.isNotEmpty(currentValue)) { - keyBytes = Hex.decode(currentValue); - fillIndex = currentValue.length() / 2; + if (StringUtils.isNotEmpty(currentStrValue)) { + if (currentStrValue.length() % 2 != 0) { + currentStrValue = "0" + currentStrValue; + } + keyBytes = Hex.decode(currentStrValue); + fillIndex = currentStrValue.length() / 2; } if (fillIndex != 0) { while (totalLength > fillIndex) { @@ -29,5 +52,36 @@ } } + /** + * todo:将对象转化16进制的字符串 + * + * @param currentObjectValue + * @return + */ + private String convertObjectToHexStr(Object currentObjectValue) { + String currentStrValue = ""; + if (currentObjectValue instanceof Long) { + currentStrValue = Long.toHexString((Long) currentObjectValue); + } + if (currentObjectValue instanceof Integer) { + currentStrValue = Integer.toHexString((Integer) currentObjectValue); + } + if (currentObjectValue instanceof Short) { + currentStrValue = Short.toString((Short) currentObjectValue); + } + if (currentObjectValue instanceof Float) { + currentStrValue = Float.toHexString((Float) currentObjectValue); + } + if (currentObjectValue instanceof Boolean) { + if ((Boolean) currentObjectValue) { + currentStrValue = "1"; + } else { + currentStrValue = "0"; + } + } else if (currentObjectValue instanceof String) { + currentStrValue = (String) currentObjectValue; + } -} + return currentStrValue; + } +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index b22a8b3..98931e2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -1,7 +1,10 @@ package com.casic.missiles.replier.decorator; +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.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; @@ -13,10 +16,7 @@ import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -36,7 +36,7 @@ */ public static ByteBuf combinedField(Map fieldConfigsMap, CombinedFieldConfig combinedFieldConfig, Object filedValue) { - if(ObjectUtils.isEmpty(combinedFieldConfig)){ + if (ObjectUtils.isEmpty(combinedFieldConfig)) { return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); @@ -47,6 +47,9 @@ //在构建长度,长度固定 fragmentByte.writeByte(combinedFieldConfig.getLength()); //然后构建业务值内容 + Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Map bizDataMap = new HashMap<>(); List fieldConfigs = new ArrayList<>(); @@ -60,40 +63,50 @@ } + /** + * todo: 字段解析反构 + * 1、字段配置排序 + * 2、检查配置是否是完整的byte组合解析 + * 3、遍历待解析的配置集合,执行协议报告构建 + * (1)获取业务值 + * (2)执行回复报文的构建 + * + * @param fieldConfigs + * @param bizDataMap + * @param fragmentByte + * @return + */ public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { - if(CollectionUtils.isEmpty(fieldConfigs)){ + if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } //根据起始点排序 List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); - Object prepareData = null; //校验是不是一个完整ByteBuf数组 - if (checkOutFrame(sortFieldConfigs)) { - for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { - if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { - prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); - } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + Assert.isFalse(checkOutFrame(sortFieldConfigs), () -> { + throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); + }); + Object prepareData = null; + for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { + //判断是否存在业务值 + if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { + prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } + buildBuf(sortFieldConfig, prepareData, fragmentByte); } return fragmentByte; } - private static String ruleValue(String filedValue, String ruleExpression) { - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (StringUtils.isNotEmpty(filedValue)) { - String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); - env2.put(targetStr, filedValue); - } - String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); - return currentConfigValue; - } - - // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 - // (1)静态的业务字段是字典里面可以配置的 - // (2)动态的业务字段是通过规则生成的 + /** + * todo:处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 + * (1)bit单位构建报文 + * (2)byte单位构建报文 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { @@ -119,4 +132,16 @@ return bitFixedLength % 8 == 0; } + private static String ruleValue(String filedValue, String ruleExpression) { + Map env2 = new HashMap(); + //如果当前实际的值不存在的时候,直接进行rule执行,不需要 + if (StringUtils.isNotEmpty(filedValue)) { + String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); + env2.put(targetStr, filedValue); + } + String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); + return currentConfigValue; + } + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index 29ede5e..d7e178d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -18,6 +18,13 @@ @Slf4j public class BitFieldDecorator { + /** + * todo: 构建bitBuf + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { Object fieldValue = new Object(); try { @@ -71,7 +78,7 @@ } /** - * 把byte转化成2进制字符串 + * todo: 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 9b8c0aa..a4d8ebc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -19,7 +19,7 @@ public class ByteFieldDecorator { /** - * 定制化的和默认的 + * todo:定制化的和默认的byte回复报文构建 * * @param fieldConfig * @param currentConfigValue @@ -27,24 +27,36 @@ */ public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - customizeDecorator(fieldConfig,currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); } } - private static void defaultDecorator(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + + /** + * todo: 默认byte构建修饰器 + * + * @param fieldConfig + * @param currentValue + * @param dynamicContent + */ + private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - if (currentValue instanceof Long) { - System.out.println("增添Long类别"); - } valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent); } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private static void customizeDecorator(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + /** + * todo: 定制化的byte报文构建修饰器 + * 1、执行前置规则处理 + * 2、调用默认的报文构建 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + * @param replyRuleExpression + */ + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { try { Map env2 = new HashMap(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -53,7 +65,7 @@ env2.put(targetStr, currentConfigValue); } currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index 15cfd62..5f94b81 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -11,14 +11,37 @@ */ public class DefaultValueTypeResolver implements AbstractValueTypeResolver { + /** + * todo: 执行业务值得构建 + * 1、判断业务类型内容,执行类型转化为16进制的报文 + * 2、执行回复报文的构建 + * + * @param totalLength + * @param currentObjectValue + * @param byteBuf + */ @Override public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf) { - String currentValue = (String) currentObjectValue; + String hexStrValue = convertObjectToHexStr(currentObjectValue); + strToByteBuf(totalLength, hexStrValue, byteBuf); + } + + /** + * todo: 将str转化bytebuf + * + * @param totalLength 应填充的总长度 + * @param currentStrValue 待填充的字符串 + * @param byteBuf 待使用的bytebuf + */ + private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf) { byte[] keyBytes = null; Integer fillIndex = 0; - if (StringUtils.isNotEmpty(currentValue)) { - keyBytes = Hex.decode(currentValue); - fillIndex = currentValue.length() / 2; + if (StringUtils.isNotEmpty(currentStrValue)) { + if (currentStrValue.length() % 2 != 0) { + currentStrValue = "0" + currentStrValue; + } + keyBytes = Hex.decode(currentStrValue); + fillIndex = currentStrValue.length() / 2; } if (fillIndex != 0) { while (totalLength > fillIndex) { @@ -29,5 +52,36 @@ } } + /** + * todo:将对象转化16进制的字符串 + * + * @param currentObjectValue + * @return + */ + private String convertObjectToHexStr(Object currentObjectValue) { + String currentStrValue = ""; + if (currentObjectValue instanceof Long) { + currentStrValue = Long.toHexString((Long) currentObjectValue); + } + if (currentObjectValue instanceof Integer) { + currentStrValue = Integer.toHexString((Integer) currentObjectValue); + } + if (currentObjectValue instanceof Short) { + currentStrValue = Short.toString((Short) currentObjectValue); + } + if (currentObjectValue instanceof Float) { + currentStrValue = Float.toHexString((Float) currentObjectValue); + } + if (currentObjectValue instanceof Boolean) { + if ((Boolean) currentObjectValue) { + currentStrValue = "1"; + } else { + currentStrValue = "0"; + } + } else if (currentObjectValue instanceof String) { + currentStrValue = (String) currentObjectValue; + } -} + return currentStrValue; + } +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index b22a8b3..98931e2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -1,7 +1,10 @@ package com.casic.missiles.replier.decorator; +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.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; @@ -13,10 +16,7 @@ import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -36,7 +36,7 @@ */ public static ByteBuf combinedField(Map fieldConfigsMap, CombinedFieldConfig combinedFieldConfig, Object filedValue) { - if(ObjectUtils.isEmpty(combinedFieldConfig)){ + if (ObjectUtils.isEmpty(combinedFieldConfig)) { return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); @@ -47,6 +47,9 @@ //在构建长度,长度固定 fragmentByte.writeByte(combinedFieldConfig.getLength()); //然后构建业务值内容 + Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Map bizDataMap = new HashMap<>(); List fieldConfigs = new ArrayList<>(); @@ -60,40 +63,50 @@ } + /** + * todo: 字段解析反构 + * 1、字段配置排序 + * 2、检查配置是否是完整的byte组合解析 + * 3、遍历待解析的配置集合,执行协议报告构建 + * (1)获取业务值 + * (2)执行回复报文的构建 + * + * @param fieldConfigs + * @param bizDataMap + * @param fragmentByte + * @return + */ public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { - if(CollectionUtils.isEmpty(fieldConfigs)){ + if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } //根据起始点排序 List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); - Object prepareData = null; //校验是不是一个完整ByteBuf数组 - if (checkOutFrame(sortFieldConfigs)) { - for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { - if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { - prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); - } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + Assert.isFalse(checkOutFrame(sortFieldConfigs), () -> { + throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); + }); + Object prepareData = null; + for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { + //判断是否存在业务值 + if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { + prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } + buildBuf(sortFieldConfig, prepareData, fragmentByte); } return fragmentByte; } - private static String ruleValue(String filedValue, String ruleExpression) { - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (StringUtils.isNotEmpty(filedValue)) { - String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); - env2.put(targetStr, filedValue); - } - String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); - return currentConfigValue; - } - - // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 - // (1)静态的业务字段是字典里面可以配置的 - // (2)动态的业务字段是通过规则生成的 + /** + * todo:处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 + * (1)bit单位构建报文 + * (2)byte单位构建报文 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { @@ -119,4 +132,16 @@ return bitFixedLength % 8 == 0; } + private static String ruleValue(String filedValue, String ruleExpression) { + Map env2 = new HashMap(); + //如果当前实际的值不存在的时候,直接进行rule执行,不需要 + if (StringUtils.isNotEmpty(filedValue)) { + String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); + env2.put(targetStr, filedValue); + } + String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); + return currentConfigValue; + } + + } diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index 7965da1..28efc6d 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -26,10 +26,12 @@ device: redis: invalid-time: 86400 - host: 127.0.0.1 - port: 6379 - password: ew5T4K3#203lwh + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh config-prefix: 'Casic:' + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer #代码生成器配置 code: generate: diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index 29ede5e..d7e178d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -18,6 +18,13 @@ @Slf4j public class BitFieldDecorator { + /** + * todo: 构建bitBuf + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { Object fieldValue = new Object(); try { @@ -71,7 +78,7 @@ } /** - * 把byte转化成2进制字符串 + * todo: 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 9b8c0aa..a4d8ebc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -19,7 +19,7 @@ public class ByteFieldDecorator { /** - * 定制化的和默认的 + * todo:定制化的和默认的byte回复报文构建 * * @param fieldConfig * @param currentConfigValue @@ -27,24 +27,36 @@ */ public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - customizeDecorator(fieldConfig,currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); } } - private static void defaultDecorator(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + + /** + * todo: 默认byte构建修饰器 + * + * @param fieldConfig + * @param currentValue + * @param dynamicContent + */ + private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - if (currentValue instanceof Long) { - System.out.println("增添Long类别"); - } valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent); } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private static void customizeDecorator(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + /** + * todo: 定制化的byte报文构建修饰器 + * 1、执行前置规则处理 + * 2、调用默认的报文构建 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + * @param replyRuleExpression + */ + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { try { Map env2 = new HashMap(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -53,7 +65,7 @@ env2.put(targetStr, currentConfigValue); } currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index 15cfd62..5f94b81 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -11,14 +11,37 @@ */ public class DefaultValueTypeResolver implements AbstractValueTypeResolver { + /** + * todo: 执行业务值得构建 + * 1、判断业务类型内容,执行类型转化为16进制的报文 + * 2、执行回复报文的构建 + * + * @param totalLength + * @param currentObjectValue + * @param byteBuf + */ @Override public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf) { - String currentValue = (String) currentObjectValue; + String hexStrValue = convertObjectToHexStr(currentObjectValue); + strToByteBuf(totalLength, hexStrValue, byteBuf); + } + + /** + * todo: 将str转化bytebuf + * + * @param totalLength 应填充的总长度 + * @param currentStrValue 待填充的字符串 + * @param byteBuf 待使用的bytebuf + */ + private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf) { byte[] keyBytes = null; Integer fillIndex = 0; - if (StringUtils.isNotEmpty(currentValue)) { - keyBytes = Hex.decode(currentValue); - fillIndex = currentValue.length() / 2; + if (StringUtils.isNotEmpty(currentStrValue)) { + if (currentStrValue.length() % 2 != 0) { + currentStrValue = "0" + currentStrValue; + } + keyBytes = Hex.decode(currentStrValue); + fillIndex = currentStrValue.length() / 2; } if (fillIndex != 0) { while (totalLength > fillIndex) { @@ -29,5 +52,36 @@ } } + /** + * todo:将对象转化16进制的字符串 + * + * @param currentObjectValue + * @return + */ + private String convertObjectToHexStr(Object currentObjectValue) { + String currentStrValue = ""; + if (currentObjectValue instanceof Long) { + currentStrValue = Long.toHexString((Long) currentObjectValue); + } + if (currentObjectValue instanceof Integer) { + currentStrValue = Integer.toHexString((Integer) currentObjectValue); + } + if (currentObjectValue instanceof Short) { + currentStrValue = Short.toString((Short) currentObjectValue); + } + if (currentObjectValue instanceof Float) { + currentStrValue = Float.toHexString((Float) currentObjectValue); + } + if (currentObjectValue instanceof Boolean) { + if ((Boolean) currentObjectValue) { + currentStrValue = "1"; + } else { + currentStrValue = "0"; + } + } else if (currentObjectValue instanceof String) { + currentStrValue = (String) currentObjectValue; + } -} + return currentStrValue; + } +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index b22a8b3..98931e2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -1,7 +1,10 @@ package com.casic.missiles.replier.decorator; +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.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; @@ -13,10 +16,7 @@ import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -36,7 +36,7 @@ */ public static ByteBuf combinedField(Map fieldConfigsMap, CombinedFieldConfig combinedFieldConfig, Object filedValue) { - if(ObjectUtils.isEmpty(combinedFieldConfig)){ + if (ObjectUtils.isEmpty(combinedFieldConfig)) { return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); @@ -47,6 +47,9 @@ //在构建长度,长度固定 fragmentByte.writeByte(combinedFieldConfig.getLength()); //然后构建业务值内容 + Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Map bizDataMap = new HashMap<>(); List fieldConfigs = new ArrayList<>(); @@ -60,40 +63,50 @@ } + /** + * todo: 字段解析反构 + * 1、字段配置排序 + * 2、检查配置是否是完整的byte组合解析 + * 3、遍历待解析的配置集合,执行协议报告构建 + * (1)获取业务值 + * (2)执行回复报文的构建 + * + * @param fieldConfigs + * @param bizDataMap + * @param fragmentByte + * @return + */ public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { - if(CollectionUtils.isEmpty(fieldConfigs)){ + if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } //根据起始点排序 List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); - Object prepareData = null; //校验是不是一个完整ByteBuf数组 - if (checkOutFrame(sortFieldConfigs)) { - for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { - if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { - prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); - } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + Assert.isFalse(checkOutFrame(sortFieldConfigs), () -> { + throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); + }); + Object prepareData = null; + for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { + //判断是否存在业务值 + if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { + prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } + buildBuf(sortFieldConfig, prepareData, fragmentByte); } return fragmentByte; } - private static String ruleValue(String filedValue, String ruleExpression) { - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (StringUtils.isNotEmpty(filedValue)) { - String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); - env2.put(targetStr, filedValue); - } - String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); - return currentConfigValue; - } - - // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 - // (1)静态的业务字段是字典里面可以配置的 - // (2)动态的业务字段是通过规则生成的 + /** + * todo:处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 + * (1)bit单位构建报文 + * (2)byte单位构建报文 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { @@ -119,4 +132,16 @@ return bitFixedLength % 8 == 0; } + private static String ruleValue(String filedValue, String ruleExpression) { + Map env2 = new HashMap(); + //如果当前实际的值不存在的时候,直接进行rule执行,不需要 + if (StringUtils.isNotEmpty(filedValue)) { + String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); + env2.put(targetStr, filedValue); + } + String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); + return currentConfigValue; + } + + } diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index 7965da1..28efc6d 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -26,10 +26,12 @@ device: redis: invalid-time: 86400 - host: 127.0.0.1 - port: 6379 - password: ew5T4K3#203lwh + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh config-prefix: 'Casic:' + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer #代码生成器配置 code: generate: diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 9dcbd61..d3b040a 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -10,7 +10,9 @@ COMBINED_LENGTH_FIELD_NULL(3001, "组合长度字段配置为空"), COMBINED_PRE_CODE_FIELD_NULL(3001, "组合配合匹配前导码为空"), - COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"); + COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), + COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), + REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"); private Integer code; private String message; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 2ccbacc..6dfbaa8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java @@ -8,7 +8,7 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 存放基本协议的的加载信息 + * todo:存放基本协议的的加载信息 */ public class AbstractProtocolConfigFactory { private final ProtocolConfigProvider protocolConfigProvider; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java index 347c0e4..abc8aa3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractRuleConfigFactory.java @@ -7,7 +7,7 @@ import com.casic.missiles.provider.FieldRuleConfigProvider; /** - * 存放规则相关的的的加载信息 + * todo: 存放规则相关的的的加载信息 */ public class AbstractRuleConfigFactory { @@ -53,5 +53,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java index 8b1cc5b..71f8b0b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultProtocolConfigFactory.java @@ -4,7 +4,9 @@ import com.casic.missiles.pojo.ProtocolConfig; /** - * 直接用,还是边用边创建 + * @author cz + * 默认协议配置工厂 + * */ public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java index ad10461..ea5c4b7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/factory/impl/DefaultRuleFactory.java @@ -2,6 +2,9 @@ import com.casic.missiles.factory.AbstractRuleConfigFactory; +/** + * @author cz + */ public class DefaultRuleFactory extends AbstractRuleConfigFactory { public DefaultRuleFactory(Long ruleId) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java index e3da624..f357d7e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParserSupport.java @@ -22,8 +22,10 @@ public class ProtocolParserSupport { - - //获取匹配规则->匹配规则 + /** + * todo: 获取规则配置,执行规则匹配 + * + */ protected RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { //取出其中参与逻辑provider并判空 ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); @@ -48,13 +50,15 @@ return null; } - //数据构建,获取固定字段的store和业务字段store + /** + * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 + */ protected List> buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { List> bizDataMapList = new ArrayList<>(); Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); List> combinedStoreObjectMap = ruleConfigFactory.getCombinedFieldConfigProvider().getStoreObjectMap(); - + //组合字段的map if (!CollectionUtils.isEmpty(combinedStoreObjectMap)) { bizDataMapList.addAll(combinedStoreObjectMap); } @@ -64,16 +68,20 @@ bizDataMap.putAll(ruleStoreObjectMap); } } + //协议字段store if (!CollectionUtils.isEmpty(protocolStoreObjectMap)) { for (Map bizDataMap : bizDataMapList) { bizDataMap.putAll(protocolStoreObjectMap); } } - - return bizDataMapList; } + /** + * todo:添加 组合字段的后置处理器 + * + * @param bizDataMap + */ protected void invokeFieldPostProcessing(List> bizDataMap) { //添加前置处理器 List abstractProcessorList = ClazzUtil.getSubClassList(AbstractPostFieldProcessor.class, false); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java index 9743d66..c1eccfe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/crc/CRCUtil.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.crc; /** - * CRC校验类 + * todo:CRC校验类 * * @author cz * @date diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java index f93e59c..ca8beb3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatchSupport.java @@ -21,7 +21,7 @@ public class FrameStructMatchSupport implements ReplyCommandEnum, FrameStructEnum { /** - * 长度处理核心流程类 + * todo:长度处理核心流程类 *

* 匹配长度分为以下情况,进行以下情况进行匹配 * 分为加密大于等于,不加密大于等于的情况 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 64665eb..2e5fe83 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 @@ -44,7 +44,7 @@ * todo: 再次匹配 如何丢弃无法识别的帧, *

* 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 - * 匹配布上的数据,如何舍弃帧 + * 匹配布上的数据 * (1)直接将目前的缓冲池进行清空(最简单) * (2)用前导集合进行匹配,进行截取丢弃前置无效的内容(情况复杂) */ @@ -97,7 +97,7 @@ } /** - * 默认获取其中使用最多的长度Id + * todo:默认获取其中使用最多的长度Id * 1、统计最多长度配置 * 2、随机选取配置最多的配置 */ @@ -111,7 +111,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 右前导码匹配 + * 以前导码长度执行字符串的截取,是否相等,保证匹配的前导准确性 */ private static Boolean doMatchRightLeadCode(String preFix, String matchContent) { if (preFix.endsWith("x")) { @@ -125,7 +126,8 @@ } /** - * 以前导码长度进行截图,是否相等,保证匹配的前导准确性 + * todo: 对帧进行配置协议的识别 + * 以前导码长度进行截取字符串长度,是否相等,获取帧内是否有存在的识别协议 */ private static Map doMatchMiddleLeadCode(ProtocolConfig protocolConfig, String matchContent) { Map protocolConfigMap = new HashMap<>(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index b53b72d..980d22d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -13,15 +13,16 @@ /** * @author cz - * + *

* 这里只进行长度与粘包长度的判断 - * */ @Order(0) public class FrameLengthMatcher extends FrameStructMatchSupport implements FrameStructMatcher { /** - * 超过长度,增加容错长度,同时增加了CRC校验,对帧结构进行判别 + * todo:通过长度获取完整的协议数据报文 + * 1、如果没有配置结尾标志和拆包长度,可以直接使用长度进行匹配 + * 2、长度相等的16进制串,执行CRC校验成功,获取完整的协议数据报文 */ @Override public ByteBuf getIntactMessageByte(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory, DatagramEventConfig datagramEventConfig) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 932330c..245ae0e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -24,7 +24,7 @@ /** * @author cz - * 后续标志验证 + * todo:后续标志获取完整实例数据报文 *

* 处理粘包分为以下情况 * 1、通过后续标志位没有结束,并且继续查询临近帧的时候,没有该数据帧的结束,则进行临时存储,存储时长为当前通道所对应的半小时时长 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 0f3adf9..fd18bf4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -15,7 +15,7 @@ import org.springframework.util.ObjectUtils; /** - * 处理后续标志位 + * todo: 结尾标志获取完整的数据报文 * 这里对尾部标志位经验较少,可以进行后续扩展增加 */ @Order(2) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java index 8f030c7..4c612f4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/store/MatchDataStore.java @@ -10,14 +10,17 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * todo:匹配数据store + */ public class MatchDataStore { /** - * key值 + * key值 */ - public static ExpiringMap> storeMap = ExpiringMap.builder() + public static ExpiringMap> storeMap = ExpiringMap.builder() - .maxSize(100) + .maxSize(1000) .expiration(1, TimeUnit.SECONDS) @@ -29,23 +32,23 @@ @Builder @Data - public static class ExpiringByteBuf{ + public static class ExpiringByteBuf { /** - * byteBuf + * byteBuf */ private ByteBuf byteBuf; /** - * 总长度 + * 总长度 */ private Integer fixPosition; /** - * 尾部起始位置 + * 尾部起始位置 */ private Integer tailPosition; /** - * 分片号 + * 分片号 */ - private Map fixedStoreMap; + private Map fixedStoreMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java index 82b2886..27f3c77 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/PretreatmentSupport.java @@ -8,8 +8,9 @@ * @author cz */ public class PretreatmentSupport { + /** - * 获取第一个大括号,对应的右括号下标值 + * todo: 取第一个大括号,对应的右括号下标值 * 算法流程 * 1、初始化totalRightBracket为0 * 2、获取首个“{”压栈,totalRightBracket加偏移下标 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java index 4898e46..588d412 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/AepPretreatment.java @@ -34,7 +34,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } - //执行nb平台前的协议解析 预处理 + /** + * todo: 执行aep平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java index 03fb0e4..43ee69d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/predecodec/impl/NbPretreatment.java @@ -30,6 +30,9 @@ this.dialect = ObjectUtil.checkNotNull(dialect, "dialect"); } + /** + * todo: 执行np平台前的协议解析 预处理为标准的协议报文 + */ @Override public ByteBuf decode(ByteBuf msg) { ByteBuf plaintextBuf = msg; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java index 2ac0d83..7bb89a6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java @@ -11,7 +11,15 @@ public class ReplyCommandPostProcessing implements ReplyCommandEnum { - public static ParseResult invoke(List> bizDataMap,AbstractRuleConfigFactory ruleConfigFactory,AbstractProtocolConfigFactory protocolFactory) { + /** + * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + public static ParseResult invoke(List> bizDataMap, AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { return ParseResult.builder().replyCommand(SUCCESS_DATA) .devcode(bizDataMap.get(0).get("devcode").toString()) .ruleConfigFactory(ruleConfigFactory) diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java index d66aa9d..649e04a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java @@ -1,7 +1,6 @@ package com.casic.missiles.parser.processor.impl; import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; -import org.apache.ibatis.annotations.Param; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -9,10 +8,13 @@ import java.util.Map; /** + * todo:后置处理器,将散落解析的时间进行合并 + * * @author cz */ public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + @Override public void invoke(List> storeFieldList) { if (storeFieldList.size() > 0) { @@ -20,7 +22,7 @@ if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime,(Integer) storeObjectMap.get("采集间隔")); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); } } return; @@ -30,17 +32,17 @@ Calendar mergeTime = Calendar.getInstance(); int hourOfDay = (Integer) storeObjectMap.get("采集时间") / 60; int minute = (Integer) storeObjectMap.get("采集时间") % 60; - mergeTime.set((Integer) storeObjectMap.get("年")+2018, (Integer) storeObjectMap.get("月"), + mergeTime.set((Integer) storeObjectMap.get("年") + 2018, (Integer) storeObjectMap.get("月"), (Integer) storeObjectMap.get("日"), hourOfDay, minute); return mergeTime; } - private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime,Integer interval) { + private void mergeAllTimeFormat(List> storeFieldList, Calendar tailMergeTime, Integer interval) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (int i = storeFieldList.size() - 1; i >= 0; i--){ + for (int i = storeFieldList.size() - 1; i >= 0; i--) { Map storeObjectMap = storeFieldList.get(i); tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间",sdf.format(tailMergeTime.getTime())); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); storeObjectMap.remove("月"); storeObjectMap.remove("年"); storeObjectMap.remove("日"); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index cd953fb..74a5927 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -45,11 +45,11 @@ private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); - Map vaildMap = new HashMap(); + Map validMap = new HashMap(); for (int i = 0; i < range.length; i++) { - vaildMap.put(Integer.valueOf(range[i]), ""); + validMap.put(Integer.valueOf(range[i]), ""); } - return vaildMap; + return validMap; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java index cf18ade..8291f68 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -5,10 +5,15 @@ import org.springframework.util.ObjectUtils; import java.util.List; +import java.util.stream.Collectors; public class FieldParserSupport { - //分别计算bit和byte长度=> 合并长度 + /** + * todo: 计算协议配置字段的总长度 + * 1、分别计算bit和byte长度 + * 2、合并长度 + */ protected Integer calculateLength(List fieldConfigList) { Integer bitFixedLength = 0; Integer byteFixedLength = 0; @@ -23,30 +28,20 @@ return fixedLength; } - //找到最大值=> 根据最大值计算业务数据下标 + /** + * todo:最大固定位置下标 + * + * 1、获取没有指定起始位置的业务内容后的字段配置集合 + * 2、分别计算固定值最大长度和业务内容后字段配置进行相减得到计算结果即是固定位置下标 + * + * @param fieldConfigList + * @return + */ protected Integer calculatePosition(List fieldConfigList) { -// String rex = "[0-9]+"; - Integer max = -1; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) - && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { - max = Integer.valueOf(fieldConfig.getOriginPositionByte()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (AbstractFieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + List filterFiledConfigs = fieldConfigList.stream() + .filter(fieldConfig -> ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte())) + .collect(Collectors.toList()); + Integer maxFixedPosition = calculateLength(fieldConfigList) -calculateLength(filterFiledConfigs); return maxFixedPosition; } } 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 d93c382..541c77b 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 @@ -44,7 +44,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); }); lengthConfig.setOriginPositionByte(combinedFieldParam.getByteBuf().readerIndex() + lengthConfig.getOriginPositionByte()); - Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig, null); + Integer fieldValue = (Integer) FieldResolver.parseField(combinedFieldParam.getByteBuf(), lengthConfig); combinedFieldParam.getByteBuf().readBytes(lengthConfig.getOffsetLength()); return fieldValue; } 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 020e0cd..665386b 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 @@ -25,7 +25,11 @@ @Slf4j public class GenericCombinedFieldResolver { - //通过查询,字段长度长度随机 + /** + * todo: 组合字段解析主要流程类 + * 通过查询,字段长度长度随机 + */ + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, List> storeObjectList, Map fieldConfigsMap) { Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); 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 d34c071..6763ab2 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 @@ -21,6 +21,12 @@ */ public class BizFieldParseProcessor implements AbstractCombinedFieldProcessor { + /** + * todo: 业务字段解析 + * + * @param combinedFieldParam + * @return + */ @Override public Object invoke(CombinedFieldProcessorParam combinedFieldParam) { List protocolFieldConfigs = (List) combinedFieldParam.getPreProcessorResult(); @@ -33,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig, null); + Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } @@ -44,7 +50,7 @@ } /** - * 计算处理后的偏移位置 + * todo:计算处理后的偏移位置 */ private Integer calculateAfterProcessPosition(AbstractFieldConfig newProtocolFieldConfig, CombinedFieldProcessorParam combinedFieldParam) { Integer originPositionIndex = newProtocolFieldConfig.getOriginPositionByte() - combinedFieldParam.getByteBuf().readerIndex(); 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 2b9d635..2f1f32a 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 @@ -22,7 +22,7 @@ public class PreBizFieldParseProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor { /** - * 把长度计算出来,同时拿到对应指定的字段解析配置 + * todo: 计算业务字段长度,同时拿到对应指定的字段解析配置 * * @param combinedFieldParam * @return @@ -34,7 +34,7 @@ throw new EngineException(EngineExceptionEnum.COMBINED_FIELD_NULL); }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); - Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(),combinedFieldParam); + Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); ArrayList fieldConfigs = new ArrayList<>(); combinedFieldParam.setTotalLength(fieldValue); //设置回填默认值判断操作,只有一个配置 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 c32f99e..515d988 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 @@ -22,6 +22,7 @@ public class PreLeadCodeProcessor extends CombinedFieldSupport implements AbstractCombinedFieldProcessor, PreLeadCodeParseStatus { /** + * todo:前导码匹配 * 匹配获取前导码,找到对应的组合字段配置,并将报文读位置前移 * * @return @@ -71,7 +72,7 @@ combinedFieldParam.getByteBuf().readBytes(combinedFieldConfig.getPrefixCode().length() / 2); Integer fieldValue = getLengthFieldValue(combinedFieldConfig.getDynamicLengthId(), combinedFieldParam); combinedFieldParam.getByteBuf().readBytes(fieldValue); - if(combinedFieldParam.getByteBuf().writerIndex()==combinedFieldParam.getByteBuf().readerIndex()){ + 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 74d7d44..fc05da9 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 @@ -22,6 +22,7 @@ public class BitFieldParser extends ByteMergeProvider { /** + * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 9744d67..ab9e818 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -25,8 +25,14 @@ public class ByteFieldParser extends ByteMergeProvider { - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 + /** + * todo: 字节字段解析核心类 + * 存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置 + * + * @param byteBuf + * @param ruleJson + * @return + */ public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); @@ -38,6 +44,12 @@ return fieldsResolveValue; } + /** + * todo: 默认解析方法 + * + * @param byteBuf + * @return + */ private static Object defaultResolve(ByteBuf byteBuf) { Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { @@ -46,9 +58,18 @@ return defaultResolveValue; } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 + /** + * todo: 定制化的字段解析器 + *

+ * 1、字节字段解析构建器 + * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 + * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 + * 4、字节归并结束或者规则结束=>继续根据规则进行判断 + * + * @param byteBuf + * @param ruleMapList + * @return + */ private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { @@ -66,7 +87,7 @@ } String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并 + //合并规则进行执行字段合并 if (ruleMapList.get(i).get("ruleType").equals("combine")) { ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); break; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java index 8c7afe4..10f50d9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -6,6 +6,7 @@ import com.casic.missiles.parser.resolver.FieldParserSupport; import com.casic.missiles.pojo.*; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; @@ -16,18 +17,25 @@ import java.util.Map; /** - * 保存使用时最基本的信息,并且使用原型模式 + * 默认协议字段解析器 */ @Slf4j public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FrameStructEnum { - //通过传入的配置和报文进行字段解析 + /** + * todo:按照配置和待解析的缓冲池解析字段 + * + * @param protocolFieldConfigs 字段配置集合 + * @param buffer 待解析的缓存池buff + * @param storeObjectMap 待存储的字段集合 + * @return + */ @Override public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } @@ -37,7 +45,13 @@ return dataMap; } - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + /** + * todo: 解析和协议帧结构相关的协议字段结合(位置、长度等信息) + * + * @param protocolFieldConfigs + * @param totalLength + * @return + */ @Override public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { Map fixedPropertyMap = new HashMap<>(); @@ -46,13 +60,15 @@ fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); fixedPropertyMap.put(TOTAL_LENGTH, totalLength); fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); - fixedPropertyMap.put(FIXED_LENGTH,fixedLength); + fixedPropertyMap.put(FIXED_LENGTH, fixedLength); return fixedPropertyMap; } /** - * 获取业务内容的byteBuf - * 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + * todo: 获取业务内容的byteBuf + * 主要流程如下所示 + * 1、通过协议配置计算固定长度 + * 2、固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 */ @Override public Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer) { @@ -60,19 +76,18 @@ //计算固定长度 Integer fixedLength = calculateLength(protocolFieldConfigs); //总长度获取 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - Integer totalLength = lightText.length(); + Integer totalLength = ByteBufUtil.hexDump(buffer).length() / 2; //计算固定长度最大长度 Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); //计算数据报文内容 frameStructBufMap.put(BEFORE_BUSINESS_CONTENT, buffer.slice(0, maxFixedPosition)); - frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition , (totalLength - fixedLength))); - frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition+ totalLength - fixedLength, fixedLength- maxFixedPosition)); + frameStructBufMap.put(AROUND_BUSINESS_CONTENT, buffer.slice(maxFixedPosition, (totalLength - fixedLength))); + frameStructBufMap.put(AFTER_BUSINESS_CONTENT, buffer.slice(maxFixedPosition + totalLength - fixedLength, fixedLength - maxFixedPosition)); return frameStructBufMap; } /** - * 获取过滤字段的长度 + * todo:获取过滤字段的长度 */ @Override public Integer totalFilterLength(ProtocolConfig protocolConfig, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java index 03e7143..8592356 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -1,6 +1,5 @@ package com.casic.missiles.parser.resolver.fields; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; import io.netty.buffer.ByteBuf; @@ -12,13 +11,16 @@ @Slf4j public class FieldResolver { - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + /** + * TODO: 解析字段 + * 分为bit和byte单位解析 + * + * @param byteBuf + * @param fieldConfig + * @return + */ + public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - originPosition -= maxFixedPosition; - } Object fieldValue = 0; //待优化 try { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java index d4ec6c7..f8a359e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -11,9 +11,19 @@ public class GenericRuleResolver { - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 + /** + * todo: 匹配规则 + * + * 1、准备前置规则字段集合 + * 2、准备固定字段集合 + * 3、执行规则匹配 + * + * @param fixDataMap + * @param ids + * @param protocolFieldConfigs + * @param ruleConfigs + * @return + */ public static RuleConfig machRule(Map fixDataMap, String ids, List protocolFieldConfigs, diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java index baae7e8..969dcf7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -7,12 +7,27 @@ import java.util.*; /** + * todo: 规则匹配的核心类 + * * @author cz * @date 2023-6-12 */ public class RuleResolverCore { + /** + * todo: 规则匹配核心方法 + * 1、通过前置字段集合匹配规则 + * 2、判断规则终止标记字段是否已经完成匹配 + * (1)完成匹配,返回当前的规则 + * (2)未终止,继续递归匹配 + * + * @param ruleConfigList + * @param metaDataMap + * @param fixDataMap + * @param fixDataFieldMap + * @return + */ public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, Map fixDataMap, Map fixDataFieldMap) { @@ -26,7 +41,7 @@ String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); //递归选定解析规则,进行规则解析 - if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + if (!("1".equals(ruleConfigOptional.get().getIsFinishMatch()))) { //递归选定规则 doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); } @@ -34,6 +49,14 @@ } + /** + * todo: 获取规则字段列表 + * + * @param preRuleConfigList + * @param fixedDataMap + * @param fixedFieldMap + * @return + */ private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, Map fixedFieldMap) { Map ruleFieldMap = new HashMap<>(); @@ -47,7 +70,13 @@ } - //匹配规则配置 + /** + * todo:匹配规则配置 + * + * @param ruleMap + * @param metaDataMap + * @return + */ private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { if (ruleMap == null || metaDataMap == null) { return null; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java deleted file mode 100644 index fc4a916..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaDemo.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import io.netty.buffer.ByteBufUtil; - -import java.util.ArrayList; -import java.util.List; - -public class TeaDemo { - - - static List tea_encrypt(int v1,int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y =v1, z = v2, sum = 0, i; - int delta = 0x9e3779b9; - //UInt32 a = k1, b = k2, c = k3, d = k4; - - for (i = 0; i < 32; i++) { - sum += delta; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * tea解密 - *参数:v:要解密的数据,长度为8字节 - * k:解密用的key,长度为16字节 - **********************************************************************/ - - static List tea_decrypt(int v1, int v2, int a, int b, int c, int d) { - List result = new ArrayList<>(); - int y = v1, z = v2, sum = 0xC6EF3720, i; - int delta = 0x9e3779b9; - //UInt32 a = k[0], b = k[1], c = k[2], d = k[3]; - - for (i = 0; i < 32; i++) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); - sum -= delta; - } - result.add(y); - result.add(z); - return result; - } - - /********************************************************************* - * 加密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:密文的字节数 - **********************************************************************/ - - public static int encrypt(byte[] src, int size_src, byte[] TEA_key) { - int a = 0; - int i = 0; - int num = 0; -// Byte[] TEA_key = new Byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; - //将明文补足为8字节的倍数 - a = (int) (size_src % 8); - if (a != 0) { - for (i = 0; i < 8 - a; i++) { - src[size_src++] = 0; - } - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //加密 - num = (int) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1= (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2= (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - - List result=tea_encrypt(src1,src2, Key1, Key2, Key3, Key4); -// src1=result.get(0); -// src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1>> 16); - src[i * 8 + 1] = (byte) (src1>> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("加密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - /********************************************************************* - * 解密算法 - *参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这 - * size_src:源数据大小,单位字节 - * key:密钥,16字节 - *返回:明文的字节数,如果失败,返回0 - **********************************************************************/ - - public static int decrypt(byte[] src, int size_src, byte[] TEA_key) { - int i = 0; - int num = 0; - //判断长度是否为8的倍数 - if (size_src % 8 != 0) { - //printf("\r\nchang du bu shi 8!!"); - return 0; - } - - int Key1 = (int) (TEA_key[3] << 24 | TEA_key[2] << 16 | TEA_key[1] << 8 | TEA_key[0]); - int Key2 = (int) (TEA_key[7] << 24 | TEA_key[6] << 16 | TEA_key[5] << 8 | TEA_key[4]); - int Key3 = (int) (TEA_key[11] << 24 | TEA_key[10] << 16 | TEA_key[9] << 8 | TEA_key[8]); - int Key4 = (int) (TEA_key[15] << 24 | TEA_key[14] << 16 | TEA_key[13] << 8 | TEA_key[12]); - List ResultList = new ArrayList(); - //解密 - num = (byte) (size_src / 8); - for (i = 0; i < num; i++) { - //tea_decrypt((UInt32*)(src + i * 8), (UInt32*)key); - //tea_encrypt((UInt32*)(src + i * 8), key); - int src1 = (int) (src[i * 8 + 3] << 24 | src[i * 8 + 2] << 16 | src[i * 8 + 1] << 8 | src[i * 8 + 0]); - int src2 = (int) (src[i * 8 + 7] << 24 | src[i * 8 + 6] << 16 | src[i * 8 + 5] << 8 | src[i * 8 + 4]); - List result=tea_decrypt(src1,src2, Key1, Key2, Key3, Key4); - src1=result.get(0); - src2=result.get(1); - src[i * 8 + 3] = (byte) (src1 >> 24); - src[i * 8 + 2] = (byte) (src1 >> 16); - src[i * 8 + 1] = (byte) (src1 >> 8); - src[i * 8 + 0] = (byte) (src1); - src[i * 8 + 7] = (byte) (src2 >> 24); - src[i * 8 + 6] = (byte) (src2 >> 16); - src[i * 8 + 5] = (byte) (src2 >> 8); - src[i * 8 + 4] = (byte) (src2); - } - System.out.println("解密后:" + ByteBufUtil.hexDump(src)); - return size_src; - } - - public static void main(String[] args) { - byte[] info = {0x15, (byte) 0xc8, (byte) 0xa8, (byte) 0xb8, 0x74, 0x2e, 0x08, 0x13, (byte) 0xbe, 0x51, 0x34, (byte) 0xb4, 0x12, 0x08, 0x6d, (byte) 0xb0, (byte) 0xed, 0x7e, (byte) 0x89, - (byte) 0xd4, (byte) 0x92, 0x2c, 0x5c, 0x24, (byte) 0xea, (byte) 0xaa, 0x0e, (byte) 0xda, (byte) 0xc3, (byte) 0x89, (byte) 0x9b, (byte) 0xb2, (byte) 0xa2, 0x5e, - (byte) 0xc6, 0x68, (byte) 0x8d, 0x41, (byte) 0x86, (byte) 0xfe, 0x73, (byte) 0xa1, 0x75, 0x37, 0x2f, 0x7c, (byte) 0xab, (byte) 0xd7}; - - - byte[] info2 = {0x10, 0x00, 0x00, 0x63, 0x00, 0x23, 0x38, 0x36, 0x39, 0x36, 0x36, 0x32, 0x30, 0x33, 0x31, 0x35, 0x38, - 0x31, 0x33, 0x37, 0x31, 0x38, 0x39, 0x38, 0x36, 0x30, 0x36, 0x31, 0x37, 0x30, 0x37, 0x30, 0x30, 0x32, 0x32, 0x35, 0x38, 0x37 - , 0x35, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - byte[] MyKey1 = {0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66}; -// byte[] MyKey1 = {0x01, 0x02, 0x03, 0x04, -// 0x05, 0x06, 0x07, 0x08, -// 0x09, 0x0A, 0x0B, 0x0C, -// 0x0D, 0x0E, 0x0F, 0x10}; - - -// System.out.println("原始数据为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); -// } - -// System.out.println("密钥为:"); -// for(int i32Index = 0; i32Index < 16; i32Index++) { -// System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); -// } -// System.out.println(); -// - encrypt(info2, info2.length, MyKey1); - System.out.println("加密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retEnBytes[i32Index]) + " "); -// } -// System.out.println(); - decrypt(info2, info2.length, MyKey1); -// System.out.println("解密后为:" + ByteBufUtil.hexDump(info2)); -// for(int i32Index = 0; i32Index < 8; i32Index++) { -// System.out.print("0x" + Integer.toHexString(retDeBytes[i32Index]) + " "); -// } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java index 5616e16..9f116d6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DataReplyCommand.java @@ -25,8 +25,9 @@ public class DataReplyCommand extends ReplyCommandSupport implements AbstractBuildReplyCommand { /** + * todo: 报文构建命令 * 成功解析帧结构内容,进行下发成功回复命令的主要流程方法 - *其构建流程逻辑如下: + * 其构建流程逻辑如下: * 1、初始化反构配置 * 2、进行业务内容的构建 * (1)默认为时间的构建 @@ -56,7 +57,7 @@ Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult.getDevcode(), parseResult.getRuleConfigFactory()); //加密分为,补零 加密报文 parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); -// pareFrameBuild + //pareFrameBuild Map fixMap = calculatedFrameLength(contentLength, parseResult.getProtocolFactory()); //帧结构计算 replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java index d4d6126..3837c8a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/ReplyCommandSupport.java @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,6 +35,8 @@ /** + * todo: 执行默认回复配置 + *

* 组合字段解析,单字段解析 * 构建业务字段的byteBuf * 关于多个业务意义的键拼接为一个字节 @@ -56,6 +57,8 @@ } /** + * todo: 执行下发配置 + *

* 取redis相关配置的值,查询相关的配置进行构建返回的帧业务内容 * * @return @@ -79,12 +82,15 @@ for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap.get(combinedFieldConfig.getDataFieldName()))); } + System.out.println(ByteBufUtil.hexDump(replyBytes)); FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); return ByteBufUtil.hexDump(replyBytes).length() / 2; } /** - * 计算帧长度 + * todo:计算帧长度 + * 1、获取过滤字段长度 + * 2、获取字段长度配置,构建长度业务字段集合 */ protected Map calculatedFrameLength(Integer contentLength, AbstractProtocolConfigFactory protocolFactory) { Integer totalFilterLength = protocolFactory.getProtocolFieldConfigProvider().getTotalFilterLength(protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig()); @@ -98,9 +104,12 @@ /** - * 构建业务前固定内容 + * todo:构建业务前固定内容 * 1、筛选业务内容前固定配置 - * 2、 + * 2、排序 + * 3、以完整的byte为单位,构建组合集合进行回复报文的构建 + * 4、执行报文构建 + * 5、返回回复的报文 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -155,6 +164,7 @@ /** * 构建crc校验位,暂时不处理 + * 弃置 * * @param frameStructByeBuf * @param protocolFieldConfigs @@ -175,9 +185,10 @@ } /** + * todo: 构建回复配置固定字段配置 * 1、判断配置的协议字段是否有变化, - * (1)没有变化则直接使用 - * (2)有变化则进行运算求值组合 + * (1)通过协议配置,没有变化则直接使用 + * (2)有变化则以byte为列表执行报文的构建 */ private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); @@ -187,13 +198,12 @@ for (List fieldConfigs : sortPreFixFieldLists) { ByteBuf combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); try { - String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); + String fieldContent = fixContent.substring(fieldConfigs.get(0).getOriginPositionByte() * 2, fieldConfigs.get(0).getOriginPositionByte() * 2 + calculateOffset(fieldConfigs) * 2); combinedFixedByteBuf.writeBytes(Hex.decode(fieldContent)); for (ProtocolFieldConfig fieldConfig : fieldConfigs) { if (StringUtils.isEmpty(fieldConfig.getIsReplyFix()) || !"1".equals(fieldConfig.getIsReplyFix())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, fixedByteBuf); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index 29ede5e..d7e178d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -18,6 +18,13 @@ @Slf4j public class BitFieldDecorator { + /** + * todo: 构建bitBuf + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { Object fieldValue = new Object(); try { @@ -71,7 +78,7 @@ } /** - * 把byte转化成2进制字符串 + * todo: 把byte转化成2进制字符串 */ private static String getBinaryStrFromByte(byte value) { String result = ""; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 9b8c0aa..a4d8ebc 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -19,7 +19,7 @@ public class ByteFieldDecorator { /** - * 定制化的和默认的 + * todo:定制化的和默认的byte回复报文构建 * * @param fieldConfig * @param currentConfigValue @@ -27,24 +27,36 @@ */ public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - customizeDecorator(fieldConfig,currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); } } - private static void defaultDecorator(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + + /** + * todo: 默认byte构建修饰器 + * + * @param fieldConfig + * @param currentValue + * @param dynamicContent + */ + private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - if (currentValue instanceof Long) { - System.out.println("增添Long类别"); - } valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent); } - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private static void customizeDecorator(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + /** + * todo: 定制化的byte报文构建修饰器 + * 1、执行前置规则处理 + * 2、调用默认的报文构建 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + * @param replyRuleExpression + */ + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { try { Map env2 = new HashMap(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 @@ -53,7 +65,7 @@ env2.put(targetStr, currentConfigValue); } currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); - defaultDecorator(fieldConfig, currentConfigValue, dynamicContent); + buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java index 15cfd62..5f94b81 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/DefaultValueTypeResolver.java @@ -11,14 +11,37 @@ */ public class DefaultValueTypeResolver implements AbstractValueTypeResolver { + /** + * todo: 执行业务值得构建 + * 1、判断业务类型内容,执行类型转化为16进制的报文 + * 2、执行回复报文的构建 + * + * @param totalLength + * @param currentObjectValue + * @param byteBuf + */ @Override public void invoke(Integer totalLength, Object currentObjectValue, ByteBuf byteBuf) { - String currentValue = (String) currentObjectValue; + String hexStrValue = convertObjectToHexStr(currentObjectValue); + strToByteBuf(totalLength, hexStrValue, byteBuf); + } + + /** + * todo: 将str转化bytebuf + * + * @param totalLength 应填充的总长度 + * @param currentStrValue 待填充的字符串 + * @param byteBuf 待使用的bytebuf + */ + private void strToByteBuf(Integer totalLength, String currentStrValue, ByteBuf byteBuf) { byte[] keyBytes = null; Integer fillIndex = 0; - if (StringUtils.isNotEmpty(currentValue)) { - keyBytes = Hex.decode(currentValue); - fillIndex = currentValue.length() / 2; + if (StringUtils.isNotEmpty(currentStrValue)) { + if (currentStrValue.length() % 2 != 0) { + currentStrValue = "0" + currentStrValue; + } + keyBytes = Hex.decode(currentStrValue); + fillIndex = currentStrValue.length() / 2; } if (fillIndex != 0) { while (totalLength > fillIndex) { @@ -29,5 +52,36 @@ } } + /** + * todo:将对象转化16进制的字符串 + * + * @param currentObjectValue + * @return + */ + private String convertObjectToHexStr(Object currentObjectValue) { + String currentStrValue = ""; + if (currentObjectValue instanceof Long) { + currentStrValue = Long.toHexString((Long) currentObjectValue); + } + if (currentObjectValue instanceof Integer) { + currentStrValue = Integer.toHexString((Integer) currentObjectValue); + } + if (currentObjectValue instanceof Short) { + currentStrValue = Short.toString((Short) currentObjectValue); + } + if (currentObjectValue instanceof Float) { + currentStrValue = Float.toHexString((Float) currentObjectValue); + } + if (currentObjectValue instanceof Boolean) { + if ((Boolean) currentObjectValue) { + currentStrValue = "1"; + } else { + currentStrValue = "0"; + } + } else if (currentObjectValue instanceof String) { + currentStrValue = (String) currentObjectValue; + } -} + return currentStrValue; + } +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java index b22a8b3..98931e2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -1,7 +1,10 @@ package com.casic.missiles.replier.decorator; +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.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; @@ -13,10 +16,7 @@ import org.bouncycastle.util.encoders.Hex; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -36,7 +36,7 @@ */ public static ByteBuf combinedField(Map fieldConfigsMap, CombinedFieldConfig combinedFieldConfig, Object filedValue) { - if(ObjectUtils.isEmpty(combinedFieldConfig)){ + if (ObjectUtils.isEmpty(combinedFieldConfig)) { return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); @@ -47,6 +47,9 @@ //在构建长度,长度固定 fragmentByte.writeByte(combinedFieldConfig.getLength()); //然后构建业务值内容 + Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); String[] dataFieldIds = combinedFieldConfig.getDataFieldIds().split(","); Map bizDataMap = new HashMap<>(); List fieldConfigs = new ArrayList<>(); @@ -60,40 +63,50 @@ } + /** + * todo: 字段解析反构 + * 1、字段配置排序 + * 2、检查配置是否是完整的byte组合解析 + * 3、遍历待解析的配置集合,执行协议报告构建 + * (1)获取业务值 + * (2)执行回复报文的构建 + * + * @param fieldConfigs + * @param bizDataMap + * @param fragmentByte + * @return + */ public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { - if(CollectionUtils.isEmpty(fieldConfigs)){ + if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } //根据起始点排序 List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); - Object prepareData = null; //校验是不是一个完整ByteBuf数组 - if (checkOutFrame(sortFieldConfigs)) { - for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { - if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { - prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); - } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + Assert.isFalse(checkOutFrame(sortFieldConfigs), () -> { + throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); + }); + Object prepareData = null; + for (AbstractFieldConfig sortFieldConfig : sortFieldConfigs) { + //判断是否存在业务值 + if (bizDataMap != null && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { + prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } + buildBuf(sortFieldConfig, prepareData, fragmentByte); } return fragmentByte; } - private static String ruleValue(String filedValue, String ruleExpression) { - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (StringUtils.isNotEmpty(filedValue)) { - String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); - env2.put(targetStr, filedValue); - } - String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); - return currentConfigValue; - } - - // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 - // (1)静态的业务字段是字典里面可以配置的 - // (2)动态的业务字段是通过规则生成的 + /** + * todo:处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 + * (1)bit单位构建报文 + * (2)byte单位构建报文 + * + * @param fieldConfig + * @param currentConfigValue + * @param dynamicContent + */ private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { @@ -119,4 +132,16 @@ return bitFixedLength % 8 == 0; } + private static String ruleValue(String filedValue, String ruleExpression) { + Map env2 = new HashMap(); + //如果当前实际的值不存在的时候,直接进行rule执行,不需要 + if (StringUtils.isNotEmpty(filedValue)) { + String targetStr = ruleExpression.substring(ruleExpression.indexOf("(") + 1, ruleExpression.indexOf(")")); + env2.put(targetStr, filedValue); + } + String currentConfigValue = String.valueOf(AviatorEvaluator.execute(ruleExpression, env2)); + return currentConfigValue; + } + + } diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index 7965da1..28efc6d 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -26,10 +26,12 @@ device: redis: invalid-time: 86400 - host: 127.0.0.1 - port: 6379 - password: ew5T4K3#203lwh + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh config-prefix: 'Casic:' + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer #代码生成器配置 code: generate: diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java index 9dcbd61..d3b040a 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/EngineExceptionEnum.java @@ -10,7 +10,9 @@ COMBINED_LENGTH_FIELD_NULL(3001, "组合长度字段配置为空"), COMBINED_PRE_CODE_FIELD_NULL(3001, "组合配合匹配前导码为空"), - COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"); + COMBINED_FIELD_NULL(3002, "组合字段解析配置为空"), + COMBINED_DATA_CONFIG_NULL(3003, "组合字段解析配置,业务配置字段为空"), + REPLY_FIELD_UNWHOLE_BYTE(3004, "回复字段解析不是完整的byte"); private Integer code; private String message; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java b/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java index 68e2481..aca711f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -1,5 +1,6 @@ package com.casic.missiles.util; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -26,12 +27,11 @@ private String configPrefix; - public HashMap getMsg(String key) { + public Map getMsg(String key) { // 判断上次保存时间,如果到期(key失效),再保存新的 String timeStampKey = configPrefix + key; Object dataJson = redisTemplate.opsForValue().get(timeStampKey); - - return (HashMap) dataJson; + return JSON.parseObject((String) dataJson); }