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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/factory/AbstractProtocolConfigFactory.java index 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 0f3d9d9..dceeb89 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -122,14 +122,14 @@ * todo: 数据订阅 */ public void storeData(List> bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); - subscribeConfigs.forEach( - subscribeConfig -> { - subscribeConfig.getSubscribeDetailConfigs().forEach( - subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) - ); - } - ); +// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// subscribeConfigs.forEach( +// subscribeConfig -> { +// subscribeConfig.getSubscribeDetailConfigs().forEach( +// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) +// ); +// } +// ); } /** 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 0f3d9d9..dceeb89 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -122,14 +122,14 @@ * todo: 数据订阅 */ public void storeData(List> bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); - subscribeConfigs.forEach( - subscribeConfig -> { - subscribeConfig.getSubscribeDetailConfigs().forEach( - subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) - ); - } - ); +// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// subscribeConfigs.forEach( +// subscribeConfig -> { +// subscribeConfig.getSubscribeDetailConfigs().forEach( +// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) +// ); +// } +// ); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java index 9c20464..5fba7f8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java @@ -1,7 +1,9 @@ package com.casic.missiles.provider; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolConfigRegistry; import com.casic.missiles.util.SpringContextUtil; @@ -19,8 +21,8 @@ private final List protocolConfigList; public ProtocolConfigProvider() { - ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); - protocolConfigList = registry.getProtocolConfigList(); + ProtocolConfigRegistry protocolRegistry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = protocolRegistry.getProtocolConfigList(); } public List getMatchList() { @@ -31,7 +33,7 @@ public Map getProtocolConfigMap() { return protocolConfigList .stream() - .collect(Collectors.toMap(e -> e.getPreFix(), e->e)); + .collect(Collectors.toMap(e -> e.getPreFix(), e -> e)); } /** @@ -42,6 +44,9 @@ public ProtocolConfigProvider(ProtocolConfig protocolConfig) { List protocolConfigs = new ArrayList<>(); protocolConfigs.add(protocolConfig); + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + List fieldRuleConfigs = ruleConfigRegistry.getFieldRuleConfigList(protocolConfig.getId()); + protocolConfig.setFieldRuleConfigMap(fieldRuleConfigs.stream().collect(Collectors.toMap(FieldRuleConfig::getId, e -> e))); protocolConfigList = protocolConfigs; } @@ -54,6 +59,7 @@ if (this.protocolConfigList == null) { return null; } else { + return protocolConfigList.get(0); } } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 0f3d9d9..dceeb89 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -122,14 +122,14 @@ * todo: 数据订阅 */ public void storeData(List> bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); - subscribeConfigs.forEach( - subscribeConfig -> { - subscribeConfig.getSubscribeDetailConfigs().forEach( - subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) - ); - } - ); +// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// subscribeConfigs.forEach( +// subscribeConfig -> { +// subscribeConfig.getSubscribeDetailConfigs().forEach( +// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) +// ); +// } +// ); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java index 9c20464..5fba7f8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java @@ -1,7 +1,9 @@ package com.casic.missiles.provider; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolConfigRegistry; import com.casic.missiles.util.SpringContextUtil; @@ -19,8 +21,8 @@ private final List protocolConfigList; public ProtocolConfigProvider() { - ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); - protocolConfigList = registry.getProtocolConfigList(); + ProtocolConfigRegistry protocolRegistry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = protocolRegistry.getProtocolConfigList(); } public List getMatchList() { @@ -31,7 +33,7 @@ public Map getProtocolConfigMap() { return protocolConfigList .stream() - .collect(Collectors.toMap(e -> e.getPreFix(), e->e)); + .collect(Collectors.toMap(e -> e.getPreFix(), e -> e)); } /** @@ -42,6 +44,9 @@ public ProtocolConfigProvider(ProtocolConfig protocolConfig) { List protocolConfigs = new ArrayList<>(); protocolConfigs.add(protocolConfig); + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + List fieldRuleConfigs = ruleConfigRegistry.getFieldRuleConfigList(protocolConfig.getId()); + protocolConfig.setFieldRuleConfigMap(fieldRuleConfigs.stream().collect(Collectors.toMap(FieldRuleConfig::getId, e -> e))); protocolConfigList = protocolConfigs; } @@ -54,6 +59,7 @@ if (this.protocolConfigList == null) { return null; } else { + return protocolConfigList.get(0); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index db0ad83..90e4b18 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -6,8 +6,11 @@ import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -33,6 +36,7 @@ private static final String PROTOCOL_POSITION = "protocolPosition"; private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); private Map frameStructMap; @@ -49,6 +53,8 @@ public ProtocolFieldConfigProvider(Long protocolId) { ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); +// FieldRuleConfigRegistry fieldRuleRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); +// protocolFieldConfigs.set(protocolConfig.fieldRuleRegistry.getFieldRuleConfigList(protocolId)); } public List getProtocolFieldConfigs() { @@ -69,7 +75,7 @@ * @param byteBuf * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -80,7 +86,7 @@ return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf); + Map fixDataMap = this.getProtocolDataMap(byteBuf,fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -190,7 +196,7 @@ if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -210,7 +216,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf) { + public Map getProtocolDataMap(ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -219,7 +225,10 @@ return (Map) singleObjects.get(FIXED_FIELD_DS); } FieldParser fieldParser = new DefaultProtocolFieldParser(); - Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs,storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap) + ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); return fixDataMap; 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 0f3d9d9..dceeb89 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -122,14 +122,14 @@ * todo: 数据订阅 */ public void storeData(List> bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); - subscribeConfigs.forEach( - subscribeConfig -> { - subscribeConfig.getSubscribeDetailConfigs().forEach( - subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) - ); - } - ); +// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// subscribeConfigs.forEach( +// subscribeConfig -> { +// subscribeConfig.getSubscribeDetailConfigs().forEach( +// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) +// ); +// } +// ); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java index 9c20464..5fba7f8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java @@ -1,7 +1,9 @@ package com.casic.missiles.provider; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolConfigRegistry; import com.casic.missiles.util.SpringContextUtil; @@ -19,8 +21,8 @@ private final List protocolConfigList; public ProtocolConfigProvider() { - ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); - protocolConfigList = registry.getProtocolConfigList(); + ProtocolConfigRegistry protocolRegistry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = protocolRegistry.getProtocolConfigList(); } public List getMatchList() { @@ -31,7 +33,7 @@ public Map getProtocolConfigMap() { return protocolConfigList .stream() - .collect(Collectors.toMap(e -> e.getPreFix(), e->e)); + .collect(Collectors.toMap(e -> e.getPreFix(), e -> e)); } /** @@ -42,6 +44,9 @@ public ProtocolConfigProvider(ProtocolConfig protocolConfig) { List protocolConfigs = new ArrayList<>(); protocolConfigs.add(protocolConfig); + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + List fieldRuleConfigs = ruleConfigRegistry.getFieldRuleConfigList(protocolConfig.getId()); + protocolConfig.setFieldRuleConfigMap(fieldRuleConfigs.stream().collect(Collectors.toMap(FieldRuleConfig::getId, e -> e))); protocolConfigList = protocolConfigs; } @@ -54,6 +59,7 @@ if (this.protocolConfigList == null) { return null; } else { + return protocolConfigList.get(0); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index db0ad83..90e4b18 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -6,8 +6,11 @@ import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -33,6 +36,7 @@ private static final String PROTOCOL_POSITION = "protocolPosition"; private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); private Map frameStructMap; @@ -49,6 +53,8 @@ public ProtocolFieldConfigProvider(Long protocolId) { ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); +// FieldRuleConfigRegistry fieldRuleRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); +// protocolFieldConfigs.set(protocolConfig.fieldRuleRegistry.getFieldRuleConfigList(protocolId)); } public List getProtocolFieldConfigs() { @@ -69,7 +75,7 @@ * @param byteBuf * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -80,7 +86,7 @@ return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf); + Map fixDataMap = this.getProtocolDataMap(byteBuf,fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -190,7 +196,7 @@ if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -210,7 +216,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf) { + public Map getProtocolDataMap(ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -219,7 +225,10 @@ return (Map) singleObjects.get(FIXED_FIELD_DS); } FieldParser fieldParser = new DefaultProtocolFieldParser(); - Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs,storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap) + ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); return fixDataMap; 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 3837c8a..4d60246 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 @@ -42,18 +42,21 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void buildBizFrameField(RuleConfig ruleConfig, ByteBuf - replyBytes, Map fieldConfigsMap, - AbstractRuleConfigFactory configFactory) { - String combinedFieldIds = ruleConfig.getCombinedFieldIds(); - Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); - List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); - for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + replyBytes, Map fieldConfigsMap,AbstractRuleConfigFactory configFactory) { + try{ + String combinedFieldIds = ruleConfig.getCombinedFieldIds(); + Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); + List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); + for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + } + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + }catch (RuntimeException rx){ + log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}",JSON.toJSON(ruleConfig),rx); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); } /** 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 0f3d9d9..dceeb89 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -122,14 +122,14 @@ * todo: 数据订阅 */ public void storeData(List> bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); - subscribeConfigs.forEach( - subscribeConfig -> { - subscribeConfig.getSubscribeDetailConfigs().forEach( - subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) - ); - } - ); +// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// subscribeConfigs.forEach( +// subscribeConfig -> { +// subscribeConfig.getSubscribeDetailConfigs().forEach( +// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) +// ); +// } +// ); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java index 9c20464..5fba7f8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java @@ -1,7 +1,9 @@ package com.casic.missiles.provider; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolConfigRegistry; import com.casic.missiles.util.SpringContextUtil; @@ -19,8 +21,8 @@ private final List protocolConfigList; public ProtocolConfigProvider() { - ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); - protocolConfigList = registry.getProtocolConfigList(); + ProtocolConfigRegistry protocolRegistry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = protocolRegistry.getProtocolConfigList(); } public List getMatchList() { @@ -31,7 +33,7 @@ public Map getProtocolConfigMap() { return protocolConfigList .stream() - .collect(Collectors.toMap(e -> e.getPreFix(), e->e)); + .collect(Collectors.toMap(e -> e.getPreFix(), e -> e)); } /** @@ -42,6 +44,9 @@ public ProtocolConfigProvider(ProtocolConfig protocolConfig) { List protocolConfigs = new ArrayList<>(); protocolConfigs.add(protocolConfig); + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + List fieldRuleConfigs = ruleConfigRegistry.getFieldRuleConfigList(protocolConfig.getId()); + protocolConfig.setFieldRuleConfigMap(fieldRuleConfigs.stream().collect(Collectors.toMap(FieldRuleConfig::getId, e -> e))); protocolConfigList = protocolConfigs; } @@ -54,6 +59,7 @@ if (this.protocolConfigList == null) { return null; } else { + return protocolConfigList.get(0); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index db0ad83..90e4b18 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -6,8 +6,11 @@ import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -33,6 +36,7 @@ private static final String PROTOCOL_POSITION = "protocolPosition"; private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); private Map frameStructMap; @@ -49,6 +53,8 @@ public ProtocolFieldConfigProvider(Long protocolId) { ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); +// FieldRuleConfigRegistry fieldRuleRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); +// protocolFieldConfigs.set(protocolConfig.fieldRuleRegistry.getFieldRuleConfigList(protocolId)); } public List getProtocolFieldConfigs() { @@ -69,7 +75,7 @@ * @param byteBuf * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -80,7 +86,7 @@ return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf); + Map fixDataMap = this.getProtocolDataMap(byteBuf,fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -190,7 +196,7 @@ if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -210,7 +216,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf) { + public Map getProtocolDataMap(ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -219,7 +225,10 @@ return (Map) singleObjects.get(FIXED_FIELD_DS); } FieldParser fieldParser = new DefaultProtocolFieldParser(); - Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs,storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap) + ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); return fixDataMap; 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 3837c8a..4d60246 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 @@ -42,18 +42,21 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void buildBizFrameField(RuleConfig ruleConfig, ByteBuf - replyBytes, Map fieldConfigsMap, - AbstractRuleConfigFactory configFactory) { - String combinedFieldIds = ruleConfig.getCombinedFieldIds(); - Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); - List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); - for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + replyBytes, Map fieldConfigsMap,AbstractRuleConfigFactory configFactory) { + try{ + String combinedFieldIds = ruleConfig.getCombinedFieldIds(); + Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); + List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); + for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + } + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + }catch (RuntimeException rx){ + log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}",JSON.toJSON(ruleConfig),rx); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); } /** 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 98931e2..2a4be73 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 0f3d9d9..dceeb89 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -122,14 +122,14 @@ * todo: 数据订阅 */ public void storeData(List> bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); - subscribeConfigs.forEach( - subscribeConfig -> { - subscribeConfig.getSubscribeDetailConfigs().forEach( - subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) - ); - } - ); +// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// subscribeConfigs.forEach( +// subscribeConfig -> { +// subscribeConfig.getSubscribeDetailConfigs().forEach( +// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) +// ); +// } +// ); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java index 9c20464..5fba7f8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java @@ -1,7 +1,9 @@ package com.casic.missiles.provider; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolConfigRegistry; import com.casic.missiles.util.SpringContextUtil; @@ -19,8 +21,8 @@ private final List protocolConfigList; public ProtocolConfigProvider() { - ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); - protocolConfigList = registry.getProtocolConfigList(); + ProtocolConfigRegistry protocolRegistry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = protocolRegistry.getProtocolConfigList(); } public List getMatchList() { @@ -31,7 +33,7 @@ public Map getProtocolConfigMap() { return protocolConfigList .stream() - .collect(Collectors.toMap(e -> e.getPreFix(), e->e)); + .collect(Collectors.toMap(e -> e.getPreFix(), e -> e)); } /** @@ -42,6 +44,9 @@ public ProtocolConfigProvider(ProtocolConfig protocolConfig) { List protocolConfigs = new ArrayList<>(); protocolConfigs.add(protocolConfig); + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + List fieldRuleConfigs = ruleConfigRegistry.getFieldRuleConfigList(protocolConfig.getId()); + protocolConfig.setFieldRuleConfigMap(fieldRuleConfigs.stream().collect(Collectors.toMap(FieldRuleConfig::getId, e -> e))); protocolConfigList = protocolConfigs; } @@ -54,6 +59,7 @@ if (this.protocolConfigList == null) { return null; } else { + return protocolConfigList.get(0); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index db0ad83..90e4b18 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -6,8 +6,11 @@ import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -33,6 +36,7 @@ private static final String PROTOCOL_POSITION = "protocolPosition"; private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); private Map frameStructMap; @@ -49,6 +53,8 @@ public ProtocolFieldConfigProvider(Long protocolId) { ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); +// FieldRuleConfigRegistry fieldRuleRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); +// protocolFieldConfigs.set(protocolConfig.fieldRuleRegistry.getFieldRuleConfigList(protocolId)); } public List getProtocolFieldConfigs() { @@ -69,7 +75,7 @@ * @param byteBuf * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -80,7 +86,7 @@ return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf); + Map fixDataMap = this.getProtocolDataMap(byteBuf,fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -190,7 +196,7 @@ if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -210,7 +216,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf) { + public Map getProtocolDataMap(ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -219,7 +225,10 @@ return (Map) singleObjects.get(FIXED_FIELD_DS); } FieldParser fieldParser = new DefaultProtocolFieldParser(); - Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs,storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap) + ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); return fixDataMap; 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 3837c8a..4d60246 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 @@ -42,18 +42,21 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void buildBizFrameField(RuleConfig ruleConfig, ByteBuf - replyBytes, Map fieldConfigsMap, - AbstractRuleConfigFactory configFactory) { - String combinedFieldIds = ruleConfig.getCombinedFieldIds(); - Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); - List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); - for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + replyBytes, Map fieldConfigsMap,AbstractRuleConfigFactory configFactory) { + try{ + String combinedFieldIds = ruleConfig.getCombinedFieldIds(); + Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); + List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); + for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + } + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + }catch (RuntimeException rx){ + log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}",JSON.toJSON(ruleConfig),rx); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); } /** 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 98931e2..2a4be73 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = null; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java index eacb937..23f687f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -3,6 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; +import java.util.List; + +/** + * @author cz + */ @Data public class AbstractFieldConfig { /** @@ -41,6 +46,4 @@ * 是否需要转存 */ private Integer isStorage; - - } 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 6dfbaa8..32b668c 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 @@ -7,6 +7,8 @@ import com.casic.missiles.provider.RuleConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import java.util.Map; + /** * todo:存放基本协议的的加载信息 */ @@ -14,17 +16,11 @@ private final ProtocolConfigProvider protocolConfigProvider; private final ProtocolFieldConfigProvider protocolFieldConfigProvider; private final RuleConfigProvider ruleConfigProvider; - private final FieldRuleConfigProvider fieldRuleConfigProvider; public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); - this.fieldRuleConfigProvider = new FieldRuleConfigProvider(protocolConfig.getId()); - } - - public FieldRuleConfigProvider getFieldRuleConfigProvider() { - return fieldRuleConfigProvider; } public ProtocolConfigProvider getProtocolConfigProvider() { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index a7f8157..f05ff1f 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -8,7 +8,7 @@ import com.casic.missiles.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.processor.ReplyCommandPostProcessing; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; import com.casic.missiles.provider.ProcessorInstanceProvider; import com.casic.missiles.pojo.*; import com.casic.missiles.provider.ProtocolConfigProvider; @@ -82,15 +82,18 @@ ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析组合业务字段 ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf, - ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(), protocolFactory.getFieldRuleConfigProvider()); + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap(),protocolConfig.getFieldRuleConfigMap()); //解析单个业务字段 - ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlainBuf); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig,clearZeroPlainBuf,protocolConfig.getFieldRuleConfigMap()); //构建发送解析任务 List> bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //定制字段处理,例如分别解析的日期需要进行日期的和合并 invokeFieldPostProcessing(bizDataMap); //根据解析内容,判断回复指令,构建解析返回内容 - result = ReplyCommandPostProcessing.invoke(bizDataMap, ruleConfigFactory, protocolFactory); + List replyCommandPostProcessings = ClazzUtil.getSubClassList(AbstractReplyCommandPostProcessing.class, false); + for (AbstractReplyCommandPostProcessing replyCommandPostProcessing : replyCommandPostProcessings) { + result = replyCommandPostProcessing.obtainReplyCommand(bizDataMap, result, ruleConfigFactory, protocolFactory); + } //数据发送,异步 datagramEventProvider.storeData(bizDataMap); } catch (RuntimeException rex) { @@ -98,7 +101,7 @@ byteBuf.resetReaderIndex(); byteBuf.readBytes(protocolConfig.getPreFix().length()); byteBuf.markReaderIndex(); - LeadingCodeMatcher.rematch(byteBuf,protocolConfigProvider.getMatchList()); + LeadingCodeMatcher.rematch(byteBuf, protocolConfigProvider.getMatchList()); return null; } return result; 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 957ece8..3126501 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 @@ -39,7 +39,7 @@ //固定字段 if (StringUtils.isNotEmpty(rulePrepareFields)) { //获取统一固定字段解析 - Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte,protocolConfig.getFieldRuleConfigMap()); //获取该协议的字段配置,用于协议规则匹配 List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); //获取规则 @@ -48,7 +48,6 @@ } return null; } - /** * todo:通过协议字段解析,组合字段解析,字段解析的store,组合返回构建的数据 */ 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 245ae0e..1f4eee9 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 @@ -46,14 +46,14 @@ return null; } Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); ByteBuf intactMessageByte = null; //暂时实现不进行跳帧的情况,都为临近的帧数据内容 if (!ObjectUtil.isEmpty(unpackFlag)) { ByteBuf matchByteBuf = matchLength(byteBuf, datagramEventConfig.getSafeLength(), protocolFactory); //取到一个完整的帧 while (matchByteBuf != null) { - unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf); + unpackFlag = protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), matchByteBuf,protocolConfig.getFieldRuleConfigMap()); //后续标志位结束 if (unpackFlag == 1) { //表示可以截取 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java new file mode 100644 index 0000000..67ce2f3 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/AbstractReplyCommandPostProcessing.java @@ -0,0 +1,34 @@ +package com.casic.missiles.parser.processor; + +import com.casic.missiles.enums.ReplyCommandEnum; +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * 可任意构建自己的命令 + * + * @author cz + * todo: 过滤筛选器抽象类,进行特定内容的指令下发 + */ +public interface AbstractReplyCommandPostProcessing extends ReplyCommandEnum { + + + /** + * 走一层过滤,没有走默认配置,加自己默认的过滤 + *

+ * todo:回复命令构建 + * + * @param bizDataMap + * @param ruleConfigFactory + * @param protocolFactory + * @return + */ + ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory); + + +} 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 deleted file mode 100644 index 7bb89a6..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/ReplyCommandPostProcessing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.parser.processor; - -import com.casic.missiles.enums.ReplyCommandEnum; -import com.casic.missiles.factory.AbstractProtocolConfigFactory; -import com.casic.missiles.factory.AbstractRuleConfigFactory; -import com.casic.missiles.provider.ProtocolFieldConfigProvider; -import com.casic.missiles.pojo.ParseResult; - -import java.util.List; -import java.util.Map; - -public class ReplyCommandPostProcessing implements ReplyCommandEnum { - - /** - * 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) - .protocolFactory(protocolFactory) - .build(); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java new file mode 100644 index 0000000..cf0dba0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/field/TimeFormatFieldProcessor.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.processor.field; + +import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * todo:后置处理器,将散落解析的时间进行合并 + * + * @author cz + */ +public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { + + + @Override + public void invoke(List> storeFieldList) { + if (storeFieldList.size() > 0) { + Map storeObjectMap = storeFieldList.get(0); + if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") + && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { + Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); + mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); + } + } + return; + } + + private Calendar mergeTimeFormat(Map storeObjectMap) { + 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("月"), + (Integer) storeObjectMap.get("日"), hourOfDay, minute); + return mergeTime; + } + + 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--) { + Map storeObjectMap = storeFieldList.get(i); + tailMergeTime.add(Calendar.MINUTE, -interval); + storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); + storeObjectMap.remove("月"); + storeObjectMap.remove("年"); + storeObjectMap.remove("日"); + storeObjectMap.remove("采集间隔"); + } + } + + +} 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 deleted file mode 100644 index 649e04a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/impl/TimeFormatFieldProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.missiles.parser.processor.impl; - -import com.casic.missiles.parser.processor.AbstractPostFieldProcessor; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -/** - * todo:后置处理器,将散落解析的时间进行合并 - * - * @author cz - */ -public class TimeFormatFieldProcessor extends AbstractPostFieldProcessor { - - - @Override - public void invoke(List> storeFieldList) { - if (storeFieldList.size() > 0) { - Map storeObjectMap = storeFieldList.get(0); - if (storeObjectMap.containsKey("月") && storeObjectMap.containsKey("年") && storeObjectMap.containsKey("日") - && storeObjectMap.containsKey("采集时间") && storeObjectMap.containsKey("采集间隔")) { - Calendar tailMergeTime = mergeTimeFormat(storeObjectMap); - mergeAllTimeFormat(storeFieldList, tailMergeTime, (Integer) storeObjectMap.get("采集间隔")); - } - } - return; - } - - private Calendar mergeTimeFormat(Map storeObjectMap) { - 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("月"), - (Integer) storeObjectMap.get("日"), hourOfDay, minute); - return mergeTime; - } - - 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--) { - Map storeObjectMap = storeFieldList.get(i); - tailMergeTime.add(Calendar.MINUTE, -interval); - storeObjectMap.put("采集时间", sdf.format(tailMergeTime.getTime())); - storeObjectMap.remove("月"); - storeObjectMap.remove("年"); - storeObjectMap.remove("日"); - storeObjectMap.remove("采集间隔"); - } - } - - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java new file mode 100644 index 0000000..ca55902 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/DefaultReplyCommandPostProcessing.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Map; + +/** + * + * 定制化的命令 + * + * @author cz + */ +public class DefaultReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (ObjectUtils.isEmpty(result)) { + result = ParseResult.builder().replyCommand(SUCCESS_DATA) + .devcode(bizDataMap.get(0).get("devcode").toString()) + .ruleConfigFactory(ruleConfigFactory) + .protocolFactory(protocolFactory) + .build(); + } + return result; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java new file mode 100644 index 0000000..c47948c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/processor/reply/UpgradesReplyCommandPostProcessing.java @@ -0,0 +1,26 @@ +package com.casic.missiles.parser.processor.reply; + +import com.casic.missiles.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.processor.AbstractReplyCommandPostProcessing; +import com.casic.missiles.pojo.ParseResult; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * 判断设备升级 + */ +public class UpgradesReplyCommandPostProcessing implements AbstractReplyCommandPostProcessing { + + + @Override + public ParseResult obtainReplyCommand(List> bizDataMap, ParseResult result, + AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + if (false) { + return null; + } + return result; + } +} 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 deleted file mode 100644 index 74a5927..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author cz - */ -@Slf4j -public class ByteMergeProvider { - - /** - * todo: 拿到所有的值合并到一个值 - */ - public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { - String values = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Map validMap = getValidRangeMap(vaildRange); - try { - //暂时不处理 -// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } - Map env2 = new HashMap(); - for (int i = 0; i < valueList.size(); i++) { - if (validMap.containsKey(i)) { - env2.put("value" + i, valueList.get(i)); - } - } - values = String.valueOf(AviatorEvaluator.execute(fieldRuleEngine.getExpression(), env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", JSONObject.toJSON(valueList), JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - - private static Map getValidRangeMap(String vaildRange) { - String[] range = vaildRange.split(","); - Map validMap = new HashMap(); - for (int i = 0; i < range.length; i++) { - validMap.put(Integer.valueOf(range[i]), ""); - } - return validMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java deleted file mode 100644 index 7728bc4..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteResolver.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import com.casic.missiles.pojo.ByteResolverParam; - -public interface ByteResolver { - - Object resolveOperationRule(ByteResolverParam byteResolverParam); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java new file mode 100644 index 0000000..d5e6c78 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteUtil.java @@ -0,0 +1,33 @@ +package com.casic.missiles.parser.resolver; + +public class ByteUtil { + + + /** + * 字节数组转为long(大端模式) + */ + public static long bytesToLongBig(byte[] bytes) { + long sum = 0; + int len = bytes.length; + for (int i = 0; i < len; i++) { + long tmp = (((long) bytes[len - 1 - i] & 0xff) << (8 * i)); + sum = sum | tmp; + } + return sum; + } + + /** + * long转为字节数组(6位) + */ + public static byte[] longToBytesBig(long n) { + byte[] b = new byte[6]; + b[5] = (byte) (n & 0xff); + b[4] = (byte) (n >> 8 & 0xff); + b[3] = (byte) (n >> 16 & 0xff); + b[2] = (byte) (n >> 24 & 0xff); + b[1] = (byte) (n >> 32 & 0xff); + b[0] = (byte) (n >> 40 & 0xff); + return b; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 5e17761..5a743f0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @@ -17,7 +18,7 @@ Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); + Map doGetParseField(List protocolFieldConfigs, Map storeObjectMap, Function resolveFieldFunction); Map getFrameStructBuf(List protocolFieldConfigs, ByteBuf buffer); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java new file mode 100644 index 0000000..f9fb380 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -0,0 +1,69 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; +import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; +import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cz + */ +@Slf4j +public class GenericFiledRuleResolver { + + /** + * todo: 拿到所有的值合并到一个值 + * 无论是bit位的解析,还是byte的解析,统一都转换成byte进行规则的换算解析 + * 1、必须进行byte与值的类型转换 + * 2、存在可能,对值进行运算 + * 3、必须 进行合并 + * 4、存在可能 对值进行运算 + * 值运算包括值缩放、格式转换、精度运算 + * 这是一般的运算流程 + */ + public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); + List byteBufList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + byteBufList.add(byteBuf.readByte()); + } + //通过类型可以控制aviator入参出参的数据 + for (Map ruleMap : ruleMapList) { + if (!ruleMap.containsKey("ruleTypeId")) { + continue; + } + String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); + String validRange = String.valueOf(ruleMap.get("validRange")); + String ruleType = String.valueOf(ruleMap.get("ruleType")); + //合并规则进行执行字段合并 + switch (ruleType) { + case "combine": + resolveRuleValue = ByteMergeResolver.resolveRule(byteBufList); + break; + case "typeConvert": + List tempByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + } + break; + case "decorate": + List decorateByteBufList = new ArrayList<>(); + for (Object object : byteBufList) { + decorateByteBufList.add(DecorateResolver.resolveRule(null)); + } + break; + } + } + return resolveRuleValue; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java new file mode 100644 index 0000000..d03b5e2 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteMergeResolver.java @@ -0,0 +1,54 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeResolver { + + /** + * 入参:值串 + * 出参:值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @param beToMergeObjects 待合并的对象集合 + * @return + */ + public static Object resolveRule(List beToMergeObjects) { + if (CollectionUtils.isEmpty(beToMergeObjects)) { + return null; + } + Object defaultResolveValue = null; + if (beToMergeObjects.get(0) instanceof String) { + String strResolveValue = ""; + for (Object beToMergeObject : beToMergeObjects) { + strResolveValue += (String) beToMergeObject; + } + defaultResolveValue = strResolveValue; + } + if (beToMergeObjects.get(0) instanceof Long) { + try { + Long longValueData = 0L; + for (Object beToMergeObject : beToMergeObjects) { + longValueData = (longValueData & 0xff) << 8; + longValueData = longValueData | (Long) beToMergeObject; + } + } catch (RuntimeException rex) { + log.error("字节解析出现异常,待合并的值集合是{},异常信息为{}", JSONObject.toJSON(beToMergeObjects), rex.getMessage()); + return null; + + } + } + + + return defaultResolveValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java deleted file mode 100644 index ea34815..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Component("convert") -@RequiredArgsConstructor -@Slf4j -public class ByteRuleResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String expression=fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java new file mode 100644 index 0000000..e60567d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteTypeResolver.java @@ -0,0 +1,51 @@ +package com.casic.missiles.parser.resolver.bytes; + +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * 数值类型转换规则 + */ +@Slf4j +public class ByteTypeResolver { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object byteBuf, String convertType) { + Object parseValue = null; + switch (convertType) { + case "hexStr": + parseValue = ByteBufUtil.hexDump((ByteBuf) byteBuf); + break; + case "assii": + parseValue = ((ByteBuf) byteBuf).toString(Charset.defaultCharset()); + break; + case "double": + parseValue = Double.longBitsToDouble((long) byteBuf); + break; + case "float": + parseValue = Float.floatToIntBits((long) byteBuf); + break; + case "int": + parseValue = (int) ((ByteBuf) byteBuf).getByte(0) & 0xff; + break; + } + return parseValue; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java new file mode 100644 index 0000000..4317516 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -0,0 +1,49 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.exception.ExpressionNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class DecorateResolver { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", Double.valueOf(value.toString())); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java deleted file mode 100644 index e2c0aed..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component("logicalShift") -@RequiredArgsConstructor -@Slf4j -public class LogicalShiftResolver implements ByteResolver { - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //字节位移 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - String logicalValue = ""; - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return byteResolverParam.getValue(); - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - if (!ObjectUtil.isEmpty(index)) { - env2.put("i", index); - } - env2.put("bytes", value); - logicalValue = String.valueOf(AviatorEvaluator.execute("((bytes & 0xff)) << (8 * i)", env2).toString()); - return logicalValue; - } catch (Exception ex) { - log.error("字节解析出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java deleted file mode 100644 index 761ec2f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.pojo.FieldRuleConfig; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author - */ -@Component("operation") -@RequiredArgsConstructor -@Slf4j -public class OperationResolver implements ByteResolver { - - - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); - try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return value; - } - String expression = fieldRuleEngine.getExpression(); - Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); - value = String.valueOf(AviatorEvaluator.execute("value + options", env2)); - return value; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 901f7ee..fa04480 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,26 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.mapper.FieldRuleConfigMapper; -import com.casic.missiles.parser.resolver.ByteResolver; import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -//精度计算 -@Component("precision") -@RequiredArgsConstructor +/** + * @author cz + * 精度计算,格式转换? + */ @Slf4j -public class PrecisionResolver implements ByteResolver { +public class PrecisionResolver { - private final FieldRuleConfigMapper fieldRuleConfigMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam) { + public Object resolveRule(ByteResolverParam byteResolverParam) { FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } 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 541c77b..61b4cab 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); + Integer fieldValue = (Integer) combinedFieldParam.getResolveFieldFunction().apply(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 d867132..46e03b8 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 @@ -4,9 +4,11 @@ import com.casic.missiles.parser.resolver.combined.impl.BizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreBizFieldParseProcessor; import com.casic.missiles.parser.resolver.combined.impl.PreLeadCodeProcessor; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.CombinedFieldProcessorParam; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -27,15 +29,14 @@ /** * todo: 组合字段解析主要流程类 - * 通过查询,字段长度长度随机 + * 通过查询,字段长度长度随机 */ - public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, - List> storeObjectList, Map fieldConfigsMap) { - Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + public void parseDataField(CombinedFieldProcessorParam combinedFieldParam) { Object median = null; List abstractProcessorList = createSortAbstractProcessors(); - CombinedFieldProcessorParam combinedFieldParam = build(byteBuf, fieldFixedMap, fieldConfigsMap, storeObjectList); + ByteBuf byteBuf = combinedFieldParam.getByteBuf(); + List> storeObjectList = combinedFieldParam.getStoreObjectList(); while (byteBuf.readerIndex() < byteBuf.writerIndex()) { for (AbstractCombinedFieldProcessor abstractProcessor : abstractProcessorList) { try { @@ -76,9 +77,10 @@ } - private CombinedFieldProcessorParam build(ByteBuf byteBuf, Map fieldFixedMap, - Map fieldConfigsMap, List> storeObjectMap) { + public static CombinedFieldProcessorParam buildCombinedFieldParam(ByteBuf byteBuf, Map fieldFixedMap, Map fieldRuleConfigMap, + Map fieldConfigsMap, List> storeObjectMap) { return CombinedFieldProcessorParam.builder() + .resolveFieldFunction(new FieldResolver().parseField(byteBuf, fieldRuleConfigMap)) .byteBuf(byteBuf) .fieldConfigsMap(fieldConfigsMap) .storeObjectList(storeObjectMap) @@ -89,7 +91,7 @@ /** * 取出前导码匹配集合 */ - private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + public static Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { Map fieldFixedMap = combinedFieldConfigList .stream() .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); 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 6763ab2..3f70f2c 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 @@ -39,7 +39,7 @@ Map storeObjectMap = getStoreObjectMap(currentIndex++, combinedFieldParam.getStoreObjectList()); for (AbstractFieldConfig abstractFieldConfig : protocolFieldConfigs) { fieldCurrent += calculateAfterProcessPosition(abstractFieldConfig, combinedFieldParam); - Object fieldValue = FieldResolver.parseField(combinedFieldParam.getByteBuf(), abstractFieldConfig); + Object fieldValue = combinedFieldParam.getResolveFieldFunction().apply(abstractFieldConfig); if (ObjectUtils.isNotEmpty(abstractFieldConfig.getIsStorage()) && abstractFieldConfig.getIsStorage() == 1) { storeObjectMap.put(abstractFieldConfig.getFieldName(), fieldValue); } 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 fc05da9..d2eed15 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 @@ -3,11 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.pojo.ByteResolverParam; -import com.casic.missiles.util.SpringContextUtil; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,14 +17,14 @@ * @author cz */ @Slf4j -public class BitFieldParser extends ByteMergeProvider { +public class BitFieldParser extends GenericRuleResolver { /** * todo: 位字段解析 * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { + public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -53,14 +51,14 @@ int i = 0; //字节归并到一起=>继续根据规则进行判断 while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(fieldValue) +// .ruleTypeId(ruleTypeId).build(); +// fieldValue = byteResolverBean.resolveRule(byteResolverParam); i++; } System.out.println(JSON.toJSON(fieldValue)); 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 ab9e818..0ba53c0 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 @@ -5,16 +5,21 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteMergeProvider; -import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.parser.resolver.ByteUtil; +import com.casic.missiles.parser.rule.GenericRuleResolver; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.util.SpringContextUtil; +import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; +import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,7 +27,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends ByteMergeProvider { +public class ByteFieldParser extends GenericRuleResolver { /** @@ -33,13 +38,13 @@ * @param ruleJson * @return */ - public static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + public static Object doParseByteField(ByteBuf byteBuf, String ruleJson, Map fieldRuleConfigMap) { Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList); + fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -51,9 +56,9 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } @@ -70,7 +75,8 @@ * @param ruleMapList * @return */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList) { + private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { + //16进制的字符串 Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); try { List bytStrList = new ArrayList<>(); @@ -78,6 +84,7 @@ for (int i = 0; i < byteBuf.writerIndex(); i++) { bytStrList.add(byteBuf.readByte()); } + int i = 0; //通过类型可以控制aviator入参出参的数据 while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { @@ -88,21 +95,21 @@ 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; - } else { - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruleTypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } +// if (ruleMapList.get(i).get("ruleType").equals("combine")) { +// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); +// break; +// } else { +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// List tempBytStr = new ArrayList<>(); +// for (int k = 0; i < bytStrList.size(); i++) { +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(k) +// .value(bytStrList.get(k)) +// .ruleTypeId(ruleTypeId).build(); +// tempBytStr.add(byteResolverBean.resolveRule(byteResolverParam)); +// } +// bytStrList = tempBytStr; +// } i++; } //字节归并到一起=>继续根据规则进行判断 @@ -113,12 +120,12 @@ } String validRange = String.valueOf(ruleMap.get("validRange")); String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(ruleResolveValue) - .ruletypeId(ruleTypeId).build(); - ruleResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); +// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); +// ByteResolverParam byteResolverParam = ByteResolverParam.builder() +// .index(null) +// .value(ruleResolveValue) +// .ruleTypeId(ruleTypeId).build(); +// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); } } System.out.println(JSON.toJSON(ruleResolveValue)); @@ -128,4 +135,19 @@ return null; } } + + public static void main(String[] args) { + String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); + byteBuf.writeBytes(Hex.decode(hexStr)); + System.out.println(byteBuf.toString(Charset.defaultCharset())); + Long longData = (long) byteBuf.getByte(0) & 0xff; + int intData = (int) byteBuf.getByte(0) & 0xff; + System.out.println(intData); + System.out.println(longData); + + Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); + // byte进行数值转换 + // 下面的解析就剩 加减缩放、值合并这两个,精度 + } } 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 10f50d9..687e786 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 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** * 默认协议字段解析器 @@ -26,16 +27,15 @@ * todo:按照配置和待解析的缓冲池解析字段 * * @param protocolFieldConfigs 字段配置集合 - * @param buffer 待解析的缓存池buff * @param storeObjectMap 待存储的字段集合 * @return */ @Override - public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + public Map doGetParseField(List protocolFieldConfigs,Map storeObjectMap, Function resolveFieldFunction) { Map dataMap = new HashMap<>(); for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { - Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig); + Object fieldValue = resolveFieldFunction.apply(protocolFieldConfig); if (!ObjectUtils.isEmpty(protocolFieldConfig.getIsStorage()) && protocolFieldConfig.getIsStorage() == 1) { storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); } 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 8592356..fa97915 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 @@ -2,10 +2,19 @@ import com.alibaba.fastjson.JSON; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** + * @author cz + * * 字段解析管理总类 */ @Slf4j @@ -16,24 +25,26 @@ * 分为bit和byte单位解析 * * @param byteBuf - * @param fieldConfig * @return */ - public static Object parseField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { - Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); - Object fieldValue = 0; - //待优化 - try { - if (fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); - fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + public Function parseField(ByteBuf byteBuf, Map fieldRuleConfigMap) { + return (AbstractFieldConfig fieldConfig) -> { + Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + Object fieldValue = 0; + //待优化 + try { + if (fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { + ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); + fieldBytes.resetReaderIndex(); + fieldValue = ByteFieldParser.doParseByteField(fieldBytes, fieldConfig.getRuleJson(),fieldRuleConfigMap); + } + } catch (RuntimeException ex) { + throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); } - } catch (RuntimeException ex) { - throw new RuntimeException("解析失败,解析配置为" + JSON.toJSON(fieldConfig), ex); - } - return fieldValue; + return fieldValue; + }; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index cd3cf28..8652ef0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -1,39 +1,64 @@ package com.casic.missiles.parser.sender.impl; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; import com.casic.missiles.parser.sender.DataSubscribeProvider; import com.casic.missiles.pojo.SubscribeDetailConfig; -import org.springframework.http.ResponseEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.Resource; -import java.util.Collections; +import java.io.IOException; import java.util.List; import java.util.Map; @Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { - @Resource - private RestTemplate restTemplate; - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). - path("/test").build(true); + String url = subscribeDetailConfig.getAddress(); + String json = JSONArray.toJSONString(bizDataMap); + doPublishDataSubscribe(json, url); + } - Map vars = Collections.singletonMap("hotel", "42"); - // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) - String result = restTemplate.getForObject("https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); - String url = "http://127.0.0.1:8080/hello"; - JSONObject param = new JSONObject(); - //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; - // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 - ResponseEntity responseEntity = restTemplate.postForEntity(url, bizDataMap, JSONObject.class); - System.out.println(JSONObject.toJSON(responseEntity)); + /** + * todo:通过post方法执行方法回调 + * + * @param json + * @param url + * @return + */ + public static String doPublishDataSubscribe(String json, String url) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return resultString; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 66f144b..90a93d8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -6,15 +6,46 @@ import java.util.List; import java.util.Map; +import java.util.Properties; +/** + * @author cz + */ @Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { - @Override public void publishDataSubscribe(List> bizDataMap, SubscribeDetailConfig subscribeDetailConfig) { } + private void getProperties() { + Properties prop = new Properties(); + + prop.put("bootstrap.servers", "192.168.221.131:9092"); + prop.put("key.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + + prop.put("value.deserializer", + "org.apache.kafka.common.serialization.StringDeserializer"); + prop.put("group.id", "con-1"); + prop.put("auto.offset.reset", "latest"); + //自动提交偏移量 + prop.put("auto.commit.intervals.ms", "true"); + //自动提交时间 + prop.put("auto.commit.interval.ms", "1000"); +// KafkaConsumer consumer = new KafkaConsumer<>(prop); +// ArrayList topics = new ArrayList<>(); +// //可以订阅多个消息 +// topics.add("hello"); +// consumer.subscribe(topics); +// while (true) { +// ConsumerRecords poll = consumer.poll(Duration.ofSeconds(20)); +// for (ConsumerRecord consumerRecord : poll) { +// System.out.println(consumerRecord); +// } +// } + } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 471f7a7..2b2a134 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -16,4 +16,7 @@ } + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java index 6d28242..580c8ad 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/ByteResolverParam.java @@ -8,5 +8,5 @@ public class ByteResolverParam { private Object value; private Integer index; - String ruletypeId; + private String ruleTypeId; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java index 6718231..2c8a883 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/CombinedFieldProcessorParam.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Function; /** * @author cz @@ -34,12 +35,12 @@ * 解析字段储存map */ private List> storeObjectList; - - /** * 解析字段储存map */ private Integer totalLength; + private Function resolveFieldFunction; + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java index c9f5417..514f88e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/CombinedFieldConfigProvider.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; -import com.casic.missiles.pojo.CombinedFieldConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.registry.CombinedFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -42,19 +40,22 @@ * @param byteBuf * @param fieldConfigsMap */ - public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, FieldRuleConfigProvider fieldRuleConfigProvider) { + public void parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf, Map fieldConfigsMap, Map fieldRuleConfigMap) { if (showSkip() || StringUtils.isEmpty(ruleConfig.getCombinedFieldIds())) { return; } List ruleCombinedConfigList = this.prepareParseField(ruleConfig); GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); byteBuf.resetReaderIndex(); - combinedFieldResolver.parseDataField(ruleCombinedConfigList, byteBuf, storeObjectMap, fieldConfigsMap); + //装配参数 + CombinedFieldProcessorParam combinedFieldProcessorParam = GenericCombinedFieldResolver. + buildCombinedFieldParam(byteBuf, GenericCombinedFieldResolver.combinedFieldLeadCodeMap(ruleCombinedConfigList),fieldRuleConfigMap, fieldConfigsMap, storeObjectMap); + combinedFieldResolver.parseDataField(combinedFieldProcessorParam); } /** * todo:查询规则对应的组合配合 - * 准备,过滤字段列表,选取所需的值 + * 准备,过滤字段列表,选取所需的值 * * @param ruleConfig * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java index 457676c..1c96040 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldConfigProvider.java @@ -1,7 +1,7 @@ package com.casic.missiles.provider; +import com.casic.missiles.parser.resolver.fields.FieldResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.registry.FieldRuleConfigRegistry; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.parser.resolver.FieldParser; @@ -26,7 +26,6 @@ private final List fieldConfigs; private Map storeObjectMap = new HashMap<>(); -// private Map singleObjects = new ConcurrentHashMap<>(); public FieldConfigProvider(Long ruleId) { FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); @@ -48,7 +47,7 @@ * @param byteBuf * @return */ - public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf) { + public Map parseDataField(RuleConfig ruleConfig, ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -57,7 +56,8 @@ if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { FieldParser fieldParser = new DefaultProtocolFieldParser(); byteBuf.resetReaderIndex(); - Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, byteBuf, storeObjectMap); + Map fixDataMap = fieldParser.doGetParseField(prepareFieldConfig, storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap)); if (CollectionUtils.isNotEmpty(fixDataMap)) { return fixDataMap; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java index 5a2372f..6e5a309 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/FieldRuleConfigProvider.java @@ -6,7 +6,12 @@ import com.casic.missiles.util.SpringContextUtil; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @author cz + */ public class FieldRuleConfigProvider { private final List fieldRuleConfigList; @@ -16,6 +21,16 @@ fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(protocolId); } + public List getFieldRuleConfigList() { + return fieldRuleConfigList; + } + +// public Map getFieldRuleConfigMap() { +// return fieldRuleConfigList.stream().collect( +// Collectors.toMap(FieldRuleConfig::getId, e -> e) +// ); +// } + /* 是否应该跳过 * * @return diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java index 0f3d9d9..dceeb89 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProcessorInstanceProvider.java @@ -122,14 +122,14 @@ * todo: 数据订阅 */ public void storeData(List> bizDataMap) { - DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); - subscribeConfigs.forEach( - subscribeConfig -> { - subscribeConfig.getSubscribeDetailConfigs().forEach( - subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) - ); - } - ); +// DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// subscribeConfigs.forEach( +// subscribeConfig -> { +// subscribeConfig.getSubscribeDetailConfigs().forEach( +// subscribeDetailConfig -> dataSubscribeProvider.publishDataSubscribe(bizDataMap, subscribeDetailConfig) +// ); +// } +// ); } /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java index 9c20464..5fba7f8 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolConfigProvider.java @@ -1,7 +1,9 @@ package com.casic.missiles.provider; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolConfigRegistry; import com.casic.missiles.util.SpringContextUtil; @@ -19,8 +21,8 @@ private final List protocolConfigList; public ProtocolConfigProvider() { - ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); - protocolConfigList = registry.getProtocolConfigList(); + ProtocolConfigRegistry protocolRegistry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = protocolRegistry.getProtocolConfigList(); } public List getMatchList() { @@ -31,7 +33,7 @@ public Map getProtocolConfigMap() { return protocolConfigList .stream() - .collect(Collectors.toMap(e -> e.getPreFix(), e->e)); + .collect(Collectors.toMap(e -> e.getPreFix(), e -> e)); } /** @@ -42,6 +44,9 @@ public ProtocolConfigProvider(ProtocolConfig protocolConfig) { List protocolConfigs = new ArrayList<>(); protocolConfigs.add(protocolConfig); + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + List fieldRuleConfigs = ruleConfigRegistry.getFieldRuleConfigList(protocolConfig.getId()); + protocolConfig.setFieldRuleConfigMap(fieldRuleConfigs.stream().collect(Collectors.toMap(FieldRuleConfig::getId, e -> e))); protocolConfigList = protocolConfigs; } @@ -54,6 +59,7 @@ if (this.protocolConfigList == null) { return null; } else { + return protocolConfigList.get(0); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java index db0ad83..90e4b18 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/provider/ProtocolFieldConfigProvider.java @@ -6,8 +6,11 @@ import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.parser.resolver.FieldParser; import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.parser.resolver.fields.FieldResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ProtocolConfig; import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; import com.casic.missiles.registry.ProtocolFieldConfigRegistry; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; @@ -33,6 +36,7 @@ private static final String PROTOCOL_POSITION = "protocolPosition"; private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); private Map storeObjectMap = new HashMap<>(); private Map frameStructMap; @@ -49,6 +53,8 @@ public ProtocolFieldConfigProvider(Long protocolId) { ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); +// FieldRuleConfigRegistry fieldRuleRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); +// protocolFieldConfigs.set(protocolConfig.fieldRuleRegistry.getFieldRuleConfigList(protocolId)); } public List getProtocolFieldConfigs() { @@ -69,7 +75,7 @@ * @param byteBuf * @return */ - public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf, Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -80,7 +86,7 @@ return (Integer) singleObjects.get(catchKey); } //加载固定长度数据集合 - Map fixDataMap = this.getProtocolDataMap(byteBuf); + Map fixDataMap = this.getProtocolDataMap(byteBuf,fieldRuleConfigMap); ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); Integer protocolFieldValue = 0; //获取约定字段的总长度 @@ -190,7 +196,7 @@ if (this.singleObjects.containsKey(catchKey)) { return (Integer) singleObjects.get(catchKey); } - Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf,protocolConfig.getFieldRuleConfigMap()); if (appointFrameLength != null) { Integer totalFilterLength = getTotalFilterLength(protocolConfig); //计算总长度 @@ -210,7 +216,7 @@ * * @return */ - public Map getProtocolDataMap(ByteBuf byteBuf) { + public Map getProtocolDataMap(ByteBuf byteBuf,Map fieldRuleConfigMap) { if (showSkip()) { return null; } @@ -219,7 +225,10 @@ return (Map) singleObjects.get(FIXED_FIELD_DS); } FieldParser fieldParser = new DefaultProtocolFieldParser(); - Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs,storeObjectMap, + new FieldResolver().parseField(byteBuf,fieldRuleConfigMap) + ); if (CollectionUtils.isNotEmpty(fixDataMap)) { this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); return fixDataMap; 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 3837c8a..4d60246 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 @@ -42,18 +42,21 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void buildBizFrameField(RuleConfig ruleConfig, ByteBuf - replyBytes, Map fieldConfigsMap, - AbstractRuleConfigFactory configFactory) { - String combinedFieldIds = ruleConfig.getCombinedFieldIds(); - Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { - throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); - }); - List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); - List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); - for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + replyBytes, Map fieldConfigsMap,AbstractRuleConfigFactory configFactory) { + try{ + String combinedFieldIds = ruleConfig.getCombinedFieldIds(); + Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_LENGTH_FIELD_NULL); + }); + List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); + List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); + for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, null)); + } + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + }catch (RuntimeException rx){ + log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}",JSON.toJSON(ruleConfig),rx); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); } /** 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 98931e2..2a4be73 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/FieldReverseDecorator.java @@ -84,7 +84,7 @@ List sortFieldConfigs = fieldConfigs.stream() .sorted((e1, e2) -> e1.getOriginPositionByte().compareTo(e2.getOriginPositionByte())).collect(Collectors.toList()); //校验是不是一个完整ByteBuf数组 - Assert.isFalse(checkOutFrame(sortFieldConfigs), () -> { + Assert.isFalse(!checkOutFrame(sortFieldConfigs), () -> { throw new EngineException(EngineExceptionEnum.REPLY_FIELD_UNWHOLE_BYTE); }); Object prepareData = null; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java index eacb937..23f687f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -3,6 +3,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; +import java.util.List; + +/** + * @author cz + */ @Data public class AbstractFieldConfig { /** @@ -41,6 +46,4 @@ * 是否需要转存 */ private Integer isStorage; - - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 2079dca..c8f2a86 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -1,9 +1,12 @@ package com.casic.missiles.pojo; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.Date; +import java.util.List; +import java.util.Map; /** * @author cz @@ -60,4 +63,8 @@ private String remark; private String ownerId; private Date createTime; + + @TableField(exist = false) + private Map fieldRuleConfigMap; + }