diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java deleted file mode 100644 index a1af6d5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@Slf4j -public class RuleDecorator implements ByteDecorator { - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java deleted file mode 100644 index a1af6d5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@Slf4j -public class RuleDecorator implements ByteDecorator { - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java new file mode 100644 index 0000000..f44ce0f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.util.ClazzUtil; +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 + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class AviatorDecorator { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + //加载自定义函数 + List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); + for (CustomizedFunction customizedFunction : customizedFunctions) { + AviatorEvaluator.addFunction(customizedFunction); + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java deleted file mode 100644 index a1af6d5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@Slf4j -public class RuleDecorator implements ByteDecorator { - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java new file mode 100644 index 0000000..f44ce0f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.util.ClazzUtil; +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 + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class AviatorDecorator { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + //加载自定义函数 + List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); + for (CustomizedFunction customizedFunction : customizedFunctions) { + AviatorEvaluator.addFunction(customizedFunction); + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java new file mode 100644 index 0000000..c0db977 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeDecorator { + + /** + * 入参:待合并的集合对象 + * 出参:解析值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @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/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java deleted file mode 100644 index a1af6d5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@Slf4j -public class RuleDecorator implements ByteDecorator { - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java new file mode 100644 index 0000000..f44ce0f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.util.ClazzUtil; +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 + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class AviatorDecorator { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + //加载自定义函数 + List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); + for (CustomizedFunction customizedFunction : customizedFunctions) { + AviatorEvaluator.addFunction(customizedFunction); + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java new file mode 100644 index 0000000..c0db977 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeDecorator { + + /** + * 入参:待合并的集合对象 + * 出参:解析值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @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/replier/decorator/rule/ByteTypeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java new file mode 100644 index 0000000..bdb5424 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java @@ -0,0 +1,73 @@ +package com.casic.missiles.replier.decorator.rule; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author 数值类型转换规则 + */ +@Slf4j +public class ByteTypeDecorator { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object currentConfigValue, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "charset": + char[] charValue = ((String) currentConfigValue).toCharArray(); + parseValue = ""; + for (char assiiChar : charValue) { + parseValue += "" + Integer.toHexString(assiiChar); + } + break; + case "double": + parseValue = Double.longBitsToDouble((long) currentConfigValue); + break; + case "float": + parseValue = currentConfigValue; + if (currentConfigValue instanceof Integer) { + parseValue = Integer.toHexString(Float.floatToIntBits((Integer)currentConfigValue)); + } + if (currentConfigValue instanceof Float) { + parseValue = Integer.toHexString(Float.floatToIntBits((float)currentConfigValue)); + } + if (currentConfigValue instanceof Long) { + parseValue = Integer.toHexString(Float.floatToIntBits((long)currentConfigValue)); + } +// parseValue = Float.t(Float.valueOf(String.valueOf(currentConfigValue))); +// charValue = ((String) parseValue).toCharArray(); +// parseValue = ""; +// for (char assiiChar : charValue) { +// parseValue += "" + (int) assiiChar; +// } + break; + case "int": + parseValue = (int) ((ByteBuf) currentConfigValue).getByte(0) & 0xff; + break; + } + } catch (RuntimeException rx) { + log.error("转换异常,转换类型为{},异常信息为{}", convertType, rx); + } + return parseValue; + } + + public static void main(String[] args) { + float str = 2.8f; + System.out.println(); + //加载自定义函数 +// List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); +// for (CustomizedFunction customizedFunction : customizedFunctions) { +// AviatorEvaluator.addFunction(customizedFunction); +// } +// Object value = String.valueOf(AviatorEvaluator.execute("hexDateFormat(\"yy-MM-dd-HH-mm-ss\")", null)); +// System.out.println(value); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java deleted file mode 100644 index a1af6d5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@Slf4j -public class RuleDecorator implements ByteDecorator { - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java new file mode 100644 index 0000000..f44ce0f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.util.ClazzUtil; +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 + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class AviatorDecorator { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + //加载自定义函数 + List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); + for (CustomizedFunction customizedFunction : customizedFunctions) { + AviatorEvaluator.addFunction(customizedFunction); + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java new file mode 100644 index 0000000..c0db977 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeDecorator { + + /** + * 入参:待合并的集合对象 + * 出参:解析值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @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/replier/decorator/rule/ByteTypeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java new file mode 100644 index 0000000..bdb5424 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java @@ -0,0 +1,73 @@ +package com.casic.missiles.replier.decorator.rule; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author 数值类型转换规则 + */ +@Slf4j +public class ByteTypeDecorator { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object currentConfigValue, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "charset": + char[] charValue = ((String) currentConfigValue).toCharArray(); + parseValue = ""; + for (char assiiChar : charValue) { + parseValue += "" + Integer.toHexString(assiiChar); + } + break; + case "double": + parseValue = Double.longBitsToDouble((long) currentConfigValue); + break; + case "float": + parseValue = currentConfigValue; + if (currentConfigValue instanceof Integer) { + parseValue = Integer.toHexString(Float.floatToIntBits((Integer)currentConfigValue)); + } + if (currentConfigValue instanceof Float) { + parseValue = Integer.toHexString(Float.floatToIntBits((float)currentConfigValue)); + } + if (currentConfigValue instanceof Long) { + parseValue = Integer.toHexString(Float.floatToIntBits((long)currentConfigValue)); + } +// parseValue = Float.t(Float.valueOf(String.valueOf(currentConfigValue))); +// charValue = ((String) parseValue).toCharArray(); +// parseValue = ""; +// for (char assiiChar : charValue) { +// parseValue += "" + (int) assiiChar; +// } + break; + case "int": + parseValue = (int) ((ByteBuf) currentConfigValue).getByte(0) & 0xff; + break; + } + } catch (RuntimeException rx) { + log.error("转换异常,转换类型为{},异常信息为{}", convertType, rx); + } + return parseValue; + } + + public static void main(String[] args) { + float str = 2.8f; + System.out.println(); + //加载自定义函数 +// List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); +// for (CustomizedFunction customizedFunction : customizedFunctions) { +// AviatorEvaluator.addFunction(customizedFunction); +// } +// Object value = String.valueOf(AviatorEvaluator.execute("hexDateFormat(\"yy-MM-dd-HH-mm-ss\")", null)); +// System.out.println(value); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java new file mode 100644 index 0000000..9b624ce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.replier.decorator.rule; + +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.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java deleted file mode 100644 index a1af6d5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@Slf4j -public class RuleDecorator implements ByteDecorator { - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java new file mode 100644 index 0000000..f44ce0f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.util.ClazzUtil; +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 + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class AviatorDecorator { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + //加载自定义函数 + List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); + for (CustomizedFunction customizedFunction : customizedFunctions) { + AviatorEvaluator.addFunction(customizedFunction); + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java new file mode 100644 index 0000000..c0db977 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeDecorator { + + /** + * 入参:待合并的集合对象 + * 出参:解析值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @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/replier/decorator/rule/ByteTypeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java new file mode 100644 index 0000000..bdb5424 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java @@ -0,0 +1,73 @@ +package com.casic.missiles.replier.decorator.rule; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author 数值类型转换规则 + */ +@Slf4j +public class ByteTypeDecorator { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object currentConfigValue, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "charset": + char[] charValue = ((String) currentConfigValue).toCharArray(); + parseValue = ""; + for (char assiiChar : charValue) { + parseValue += "" + Integer.toHexString(assiiChar); + } + break; + case "double": + parseValue = Double.longBitsToDouble((long) currentConfigValue); + break; + case "float": + parseValue = currentConfigValue; + if (currentConfigValue instanceof Integer) { + parseValue = Integer.toHexString(Float.floatToIntBits((Integer)currentConfigValue)); + } + if (currentConfigValue instanceof Float) { + parseValue = Integer.toHexString(Float.floatToIntBits((float)currentConfigValue)); + } + if (currentConfigValue instanceof Long) { + parseValue = Integer.toHexString(Float.floatToIntBits((long)currentConfigValue)); + } +// parseValue = Float.t(Float.valueOf(String.valueOf(currentConfigValue))); +// charValue = ((String) parseValue).toCharArray(); +// parseValue = ""; +// for (char assiiChar : charValue) { +// parseValue += "" + (int) assiiChar; +// } + break; + case "int": + parseValue = (int) ((ByteBuf) currentConfigValue).getByte(0) & 0xff; + break; + } + } catch (RuntimeException rx) { + log.error("转换异常,转换类型为{},异常信息为{}", convertType, rx); + } + return parseValue; + } + + public static void main(String[] args) { + float str = 2.8f; + System.out.println(); + //加载自定义函数 +// List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); +// for (CustomizedFunction customizedFunction : customizedFunctions) { +// AviatorEvaluator.addFunction(customizedFunction); +// } +// Object value = String.valueOf(AviatorEvaluator.execute("hexDateFormat(\"yy-MM-dd-HH-mm-ss\")", null)); +// System.out.println(value); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java new file mode 100644 index 0000000..9b624ce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.replier.decorator.rule; + +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.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index 822cac6..376cedc 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -15,7 +15,12 @@ @Override public List getCombinedFieldConfigList(Long ruleId) { QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", ruleId); + .and(wq -> { + wq.eq("rule_id", ruleId) + .or() + .eq("rule_id", 0); + + }); List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); return combinedFieldConfigs; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java index 4ce99d2..b5c4eeb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/command/DefaultReplyCommand.java @@ -2,10 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.parser.crc.CRC16; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ParseResult; -import com.casic.missiles.pojo.ProtocolFieldConfig; -import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.pojo.*; import com.casic.missiles.provider.RuleConfigProvider; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -44,6 +41,7 @@ ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); Map frameStructMap = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getFrameStructMap(); List protocolFieldConfigs = parseResult.getProtocolFactory().getProtocolFieldConfigProvider().getProtocolFieldConfigs(); + Map fieldRuleConfigMap = parseResult.getProtocolFactory().getProtocolConfigProvider().getCurrentProtocolConfig().getFieldRuleConfigMap(); Map fieldConfigsMap = parseResult.getRuleConfigFactory().getFieldConfigProvider().getFieldConfigsMap(); RuleConfigProvider ruleConfigProvider = parseResult.getProtocolFactory().getRuleConfigProvider(); //通过下发配置,执行命令的构建 @@ -54,10 +52,10 @@ //为回复配置 Map bizDataMap = beforeRuleReply(parseResult); //规则指定回复配置 - defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory()); + defaultRuleReply(sendRuleConfig, replyBytes, bizDataMap, fieldConfigsMap, parseResult.getRuleConfigFactory(), fieldRuleConfigMap); int oldLength = ByteBufUtil.hexDump(replyBytes).length() / 2; //判断是否有下发配置,获取内容,组建配置,通过设备编号去拿数据 - Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult); + Integer contentLength = buildBizConfigFieldFrame(replyBytes, fieldConfigsMap, parseResult,fieldRuleConfigMap); //加密分为,补零 加密报文 replyBytes = parseResult.getRuleConfigFactory().getDatagramEventProvider().buildSafeDatagram(replyBytes, fieldConfigsMap); //pareFrameBuild @@ -66,7 +64,7 @@ Boolean isDeliver = (oldLength != contentLength); preparationParameter(fixMap, parseResult, isDeliver); //帧结构计算 - replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap); + replyBytes = buildFrameBeforeFixedField(frameStructMap.get(BEFORE_BUSINESS_CONTENT), protocolFieldConfigs, replyBytes, fixMap,fieldRuleConfigMap); System.out.println("CRC校验前: " + ByteBufUtil.hexDump(replyBytes)); //组建CRC校验位 replyBytes.writeBytes(Hex.decode(CRC16.getCRC(ByteBufUtil.hexDump(replyBytes)))); 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 fac042d..057755f 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 @@ -88,7 +88,7 @@ * 关于多个业务意义的键拼接为一个字节 */ protected void defaultRuleReply(RuleConfig ruleConfig, ByteBuf replyBytes, Map bizDataMap, - Map fieldConfigsMap, AbstractRuleConfigFactory configFactory) { + Map fieldConfigsMap, AbstractRuleConfigFactory configFactory, Map fieldRuleConfigMap) { try { String combinedFieldIds = ruleConfig.getCombinedFieldIds(); Assert.isFalse(StringUtils.isEmpty(combinedFieldIds), () -> { @@ -97,9 +97,9 @@ List combinedFieldConfigs = configFactory.getCombinedFieldConfigProvider().prepareParseField(ruleConfig); List fieldConfigs = configFactory.getFieldConfigProvider().prepareParseField(ruleConfig); for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } - FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, null, replyBytes, fieldRuleConfigMap, null); } catch (RuntimeException rx) { log.error("构建默认的回复报文异常,规则配置为{},异常信息为{}", JSON.toJSON(ruleConfig), rx); } @@ -112,9 +112,9 @@ * * @return */ - protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult) { + protected Integer buildBizConfigFieldFrame(ByteBuf replyBytes, Map fieldConfigsMap, ParseResult parseResult, Map fieldRuleConfigMap) { //如果不是默认的回复机制,则直接返回当前构建内容的长度 - if (parseResult.getReplyCommand().equals(SUCCESS_DATA)) { + if (parseResult.getReplyCommand() != SUCCESS_DATA) { return ByteBufUtil.hexDump(replyBytes).length() / 2; } String devcode = parseResult.getDevcode(); @@ -134,10 +134,10 @@ e -> bizDataMap.containsKey(e.getFieldName())).collect(Collectors.toList()); // 根据配置填充,返回数据长度 for (CombinedFieldConfig combinedFieldConfig : combinedFieldConfigs) { - replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap)); + replyBytes.writeBytes(FieldReverseDecorator.combinedField(fieldConfigsMap, combinedFieldConfig, bizDataMap, fieldRuleConfigMap)); } System.out.println(ByteBufUtil.hexDump(replyBytes)); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, replyBytes, fieldRuleConfigMap, null); return ByteBufUtil.hexDump(replyBytes).length() / 2; } @@ -197,7 +197,7 @@ * @param protocolFieldConfigs * @param replyBytes */ - protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap) { + protected ByteBuf buildFrameBeforeFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fixMap, Map fieldRuleConfigMap) { //通过起始位置byte不为空进行前固定配置的筛选 List preFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isNotEmpty(fieldConfig.getOriginPositionByte())) @@ -220,7 +220,7 @@ sortPreFixFieldLists.add(protocolFieldConfigList); } //进行构建下发名称,构建内容 - ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap); + ByteBuf headBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, fixMap, fieldRuleConfigMap); //写入已经存在的回复的业务内容 headBuf.writeBytes(replyBytes); //将组合得到的帧作为结果进行返回 @@ -253,7 +253,7 @@ * @param replyBytes */ @Deprecated - protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes) { + protected void buildFrameTailFixedField(ByteBuf frameStructByeBuf, List protocolFieldConfigs, ByteBuf replyBytes, Map fieldRuleConfigMap) { //筛选 List tailFixFieldList = protocolFieldConfigs.stream() .filter(fieldConfig -> ObjectUtil.isEmpty(fieldConfig.getOriginPositionByte())) @@ -261,7 +261,7 @@ List> sortPreFixFieldLists = new ArrayList<>(); sortPreFixFieldLists.add(tailFixFieldList); //构建内容 - ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null); + ByteBuf tailBuf = buildFixedFieldCommand(frameStructByeBuf, sortPreFixFieldLists, null, fieldRuleConfigMap); //填充 replyBytes.writeBytes(tailBuf); } @@ -272,7 +272,7 @@ * (1)通过协议配置,没有变化则直接使用 * (2)有变化则以byte为列表执行报文的构建 */ - private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap) { + private ByteBuf buildFixedFieldCommand(ByteBuf frameStructByeBuf, List> sortPreFixFieldLists, Map bizDataMap, Map fieldRuleConfigMap) { ByteBuf fixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); frameStructByeBuf.resetReaderIndex(); String fixContent = ByteBufUtil.hexDump(frameStructByeBuf); @@ -287,12 +287,12 @@ if ("bit".equals(fieldConfig.getOffsetUnit())) { fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } else { combinedFixedByteBuf = ByteBufAllocator.DEFAULT.buffer(); fieldConfigs = new ArrayList<>(); fieldConfigs.add(fieldConfig); - FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf); + FieldReverseDecorator.simpleField(fieldConfigs, bizDataMap, combinedFixedByteBuf, fieldRuleConfigMap, null); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java index ff58f89..39f37e6 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/BitFieldDecorator.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; /** * @author cz @@ -25,13 +27,14 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildBitBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent,Map fieldRuleConfigMap) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); if (StringUtils.isNotEmpty(fieldConfig.getReplyRule())) { + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(fieldConfig.getReplyRule()); Map env2 = new HashMap(); - String replyRuleExpression = fieldConfig.getReplyRule(); + String replyRuleExpression = fieldRuleConfig.getExpression(); //如果当前实际的值不存在的时候,直接进行rule执行,不需要 if (ObjectUtils.isNotEmpty(currentConfigValue)) { String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java index 0a567e1..ddaadbe 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/ByteFieldDecorator.java @@ -1,18 +1,26 @@ package com.casic.missiles.replier.decorator; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.parser.resolver.rule.ByteMergeResolver; +import com.casic.missiles.parser.resolver.rule.ByteTypeResolver; +import com.casic.missiles.parser.resolver.rule.DecorateResolver; import com.casic.missiles.pojo.AbstractFieldConfig; -import com.casic.missiles.util.ClazzUtil; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.replier.decorator.rule.AviatorDecorator; +import com.casic.missiles.replier.decorator.rule.ByteMergeDecorator; +import com.casic.missiles.replier.decorator.rule.ByteTypeDecorator; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author cz @@ -28,11 +36,16 @@ * @param currentConfigValue * @param dynamicContent */ - public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + public static void buildByteBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { if (StringUtils.isEmpty(fieldConfig.getReplyRule())) { + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + } buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } else { - buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule()); + buildCustomByte(fieldConfig, currentConfigValue, dynamicContent, fieldConfig.getReplyRule(), fieldRuleConfigMap, realLengthConsumer); } } @@ -45,7 +58,9 @@ * @param dynamicContent */ private static void buildDefaultByte(AbstractFieldConfig fieldConfig, Object currentValue, ByteBuf dynamicContent) { + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + //是不是网络序 Boolean networkOrder = ObjectUtils.isNotEmpty(fieldConfig.getNetworkOrder()) && fieldConfig.getNetworkOrder() == 1 ? true : false; valueTypeResolver.invoke(fieldConfig.getOffsetLength(), currentValue, dynamicContent, networkOrder); } @@ -58,25 +73,38 @@ * @param fieldConfig * @param currentConfigValue * @param dynamicContent - * @param replyRuleExpression + * @param ruleIds */ - private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent, String replyRuleExpression) { + private static void buildCustomByte(AbstractFieldConfig fieldConfig, Object currentConfigValue, + ByteBuf dynamicContent, String ruleIds, Map fieldRuleConfigMap, Function realLengthConsumer) { try { - //加载自定义函数 - List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); - for (CustomizedFunction customizedFunction : customizedFunctions) { - AviatorEvaluator.addFunction(customizedFunction); + String[] ruleStrs = ruleIds.split(","); + //通过类型可以控制aviator入参出参的数据 + for (String ruleId : ruleStrs) { + FieldRuleConfig fieldRuleConfig = fieldRuleConfigMap.get(Long.valueOf(ruleId)); + String ruleType = fieldRuleConfig.getRuleType(); + //合并规则进行执行字段合并 + switch (ruleType) { +// case "combine": +// currentConfigValue = ByteMergeDecorator.resolveRule(currentConfigValue); +// break; + case "typeConvert": + currentConfigValue = ByteTypeDecorator.resolveRule(currentConfigValue, fieldRuleConfig.getExpression()); + break; + case "decorate": + currentConfigValue = AviatorDecorator.resolveRule(currentConfigValue, fieldRuleConfig); + break; + } } - Map env2 = new HashMap(); - //如果当前实际的值不存在的时候,直接进行rule执行,不需要 - if (ObjectUtils.isNotEmpty(currentConfigValue)) { - String targetStr = replyRuleExpression.substring(replyRuleExpression.indexOf("(") + 1, replyRuleExpression.indexOf(")")); - env2.put(targetStr, currentConfigValue); + //计算长度 + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); } - currentConfigValue = AviatorEvaluator.execute(replyRuleExpression, env2); buildDefaultByte(fieldConfig, currentConfigValue, dynamicContent); } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), replyRuleExpression, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,配置为为{},解析表达式为{},异常信息为{}", JSONObject.toJSON(fieldConfig), ruleIds, ex.getMessage()); } } 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 7d6d9b7..291aa2f 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 @@ -8,6 +8,7 @@ import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.CombinedFieldConfig; import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -17,6 +18,8 @@ import java.nio.charset.Charset; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -35,25 +38,16 @@ * (3)将核心字段的反构,交给解析器进行反构 */ public static ByteBuf combinedField(Map fieldConfigsMap, - CombinedFieldConfig combinedFieldConfig, Map bizDataMap) { + CombinedFieldConfig combinedFieldConfig, Map bizDataMap, Map fieldRuleConfigMap) { if (ObjectUtils.isEmpty(combinedFieldConfig)) { + return null; } ByteBuf fragmentByte = ByteBufAllocator.DEFAULT.buffer(); //先构建oid编号 fragmentByte.writeBytes(Hex.decode(combinedFieldConfig.getPrefixCode())); //动态生成的长度 - if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { - List fieldConfigs = new ArrayList<>(); - fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); - Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); - combinedFieldConfig.setLength((Integer) prepareData); - simpleField(fieldConfigs, bizDataMap, fragmentByte); - } else { - //静态配置的长度 - AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); - valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); - } + Function realLengthConsumer = realContentLength(combinedFieldConfig, bizDataMap, fragmentByte, fieldConfigsMap, fieldRuleConfigMap); //然后构建业务值内容 Assert.isFalse(StringUtils.isEmpty(combinedFieldConfig.getDataFieldIds()), () -> { throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); @@ -62,16 +56,59 @@ List fieldConfigs = new ArrayList<>(); for (String dataFieldId : dataFieldIds) { FieldConfig fieldConfig = fieldConfigsMap.get(Long.valueOf(dataFieldId)); + Assert.isFalse(ObjectUtils.isEmpty(fieldConfig), () -> { + throw new EngineException(EngineExceptionEnum.COMBINED_DATA_CONFIG_NULL); + }); if (dataFieldIds.length == 1) { fieldConfig.setFieldName(combinedFieldConfig.getDataFieldName()); - fieldConfig.setOffsetLength(combinedFieldConfig.getLength()); } fieldConfigs.add(fieldConfig); } - simpleField(fieldConfigs, bizDataMap, fragmentByte); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, realLengthConsumer); return fragmentByte; } + /** + * 计算长度 + * + * @param combinedFieldConfig + * @param bizDataMap + * @param fragmentByte + * @param fieldConfigsMap + * @param fieldRuleConfigMap + * @return + */ + private static Function realContentLength(CombinedFieldConfig combinedFieldConfig, Map bizDataMap, ByteBuf fragmentByte, + Map fieldConfigsMap, Map fieldRuleConfigMap) {//以实际长度为准 + return (Integer realLength) -> { + if (ObjectUtils.isEmpty(combinedFieldConfig.getLength()) || combinedFieldConfig.getLength() == 0) { + List fieldConfigs = new ArrayList<>(); + fieldConfigs.add(fieldConfigsMap.get(combinedFieldConfig.getDynamicLengthId())); + Object prepareData = bizDataMap.get(fieldConfigs.get(0).getFieldName()); + combinedFieldConfig.setLength((Integer) prepareData); + simpleField(fieldConfigs, bizDataMap, fragmentByte, fieldRuleConfigMap, null); + } else { + //静态配置的长度 + AbstractValueTypeResolver valueTypeResolver = new DefaultValueTypeResolver(); + if (combinedFieldConfig.getLength() > 0) { + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + valueTypeResolver.invoke(2, combinedFieldConfig.getLength(), fragmentByte, false); + } else { + //改成回调 + //以实际长度为准 + int sampleStandardLength = 0 - combinedFieldConfig.getLength(); + if (bizDataMap.containsKey(combinedFieldConfig.getDataFieldName())) { + //实际长度要小于等于参考长度 + if (realLength <= sampleStandardLength) { + valueTypeResolver.invoke(2, realLength, fragmentByte, false); + combinedFieldConfig.setLength(combinedFieldConfig.getLength()); + } + } + } + } + return combinedFieldConfig.getLength(); + }; + } /** * 字段解析反构 @@ -86,7 +123,9 @@ * @param fragmentByte * @return */ - public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf fragmentByte) { + public static ByteBuf simpleField(List fieldConfigs, Map bizDataMap, ByteBuf + fragmentByte, Map fieldRuleConfigMap, Function realLengthConsumer) { if (CollectionUtils.isEmpty(fieldConfigs)) { return null; } @@ -103,7 +142,7 @@ if (ObjectUtils.isNotEmpty(bizDataMap) && bizDataMap.containsKey(sortFieldConfig.getFieldName())) { prepareData = bizDataMap.get(sortFieldConfig.getFieldName()); } - buildBuf(sortFieldConfig, prepareData, fragmentByte); + buildBuf(sortFieldConfig, prepareData, fragmentByte, fieldRuleConfigMap, realLengthConsumer); } return fragmentByte; } @@ -117,12 +156,19 @@ * @param currentConfigValue * @param dynamicContent */ - private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf dynamicContent) { + private static void buildBuf(AbstractFieldConfig fieldConfig, Object currentConfigValue, ByteBuf + dynamicContent, Map fieldRuleConfigMap, Function realLengthConsumer) { //待优化 if (fieldConfig.getOffsetUnit().equals("bit")) { - BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent); + if (realLengthConsumer != null) { + Integer realLength = realLengthConsumer.apply(currentConfigValue instanceof String ? + ((String) currentConfigValue).length() % 2 == 1 ? ((String) currentConfigValue).length() / 2 + 1 : ((String) currentConfigValue).length() / 2 : 0); + fieldConfig.setOffsetLength(realLength); + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); + } + BitFieldDecorator.buildBitBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap); } else { - ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent); + ByteFieldDecorator.buildByteBuf(fieldConfig, currentConfigValue, dynamicContent, fieldRuleConfigMap, realLengthConsumer); } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java deleted file mode 100644 index ad93e8c..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/LogicalShiftDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; -; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); -// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return null; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java deleted file mode 100644 index ce28ee8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/OperationDecorator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@Slf4j -public class OperationDecorator implements ByteDecorator { - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { -// RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}", enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java deleted file mode 100644 index 85b6ce7..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/PrecisionDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java deleted file mode 100644 index a1af6d5..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/impl/RuleDecorator.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.casic.missiles.replier.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.replier.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@Slf4j -public class RuleDecorator implements ByteDecorator { - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - try { - Map env2 = new HashMap(); -// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); -// String[] contentIdList = nodeDecoratorParm.getContents().split(","); -// for (String contentId : contentIdList) { -// RuleDict ruleDict = ruleDictMap.get(contentId); -// if (ruleDict.getCode().contains("#")) { -// //使用动态的值 -// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); -// } -// env2.put(ruleDict.getName(), ruleDict.getCode()); -// } -// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); -// if (ObjectUtil.isEmpty(fieldRuleEngine)) { -// return null; -// } -// String expresstion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java new file mode 100644 index 0000000..f44ce0f --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/AviatorDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.function.CustomizedFunction; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.util.ClazzUtil; +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 + * 运算缩减等操作,这里支持aviator + * 格式,精度运算等操作 + */ +@Slf4j +public class AviatorDecorator { + + /** + * 入参:值 + * 出参:值 + * 数值的转换 + * 混合运算,有常量或者乘除的缩放 + */ + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + //加载自定义函数 + List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); + for (CustomizedFunction customizedFunction : customizedFunctions) { + AviatorEvaluator.addFunction(customizedFunction); + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + value = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return value; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java new file mode 100644 index 0000000..c0db977 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteMergeDecorator.java @@ -0,0 +1,52 @@ +package com.casic.missiles.replier.decorator.rule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author cz + * 合并 + */ +@Slf4j +public class ByteMergeDecorator { + + /** + * 入参:待合并的集合对象 + * 出参:解析值 + * 合并如果是字符串就是拼接,其他执行数值的移动 + * + * @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/replier/decorator/rule/ByteTypeDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java new file mode 100644 index 0000000..bdb5424 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/ByteTypeDecorator.java @@ -0,0 +1,73 @@ +package com.casic.missiles.replier.decorator.rule; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author 数值类型转换规则 + */ +@Slf4j +public class ByteTypeDecorator { + + /** + * 入参:单个byte串、转换类型 + * 出参: 当前的值 + * + * @param + * @return + */ + public static Object resolveRule(Object currentConfigValue, String convertType) { + Object parseValue = null; + try { + switch (convertType) { + case "charset": + char[] charValue = ((String) currentConfigValue).toCharArray(); + parseValue = ""; + for (char assiiChar : charValue) { + parseValue += "" + Integer.toHexString(assiiChar); + } + break; + case "double": + parseValue = Double.longBitsToDouble((long) currentConfigValue); + break; + case "float": + parseValue = currentConfigValue; + if (currentConfigValue instanceof Integer) { + parseValue = Integer.toHexString(Float.floatToIntBits((Integer)currentConfigValue)); + } + if (currentConfigValue instanceof Float) { + parseValue = Integer.toHexString(Float.floatToIntBits((float)currentConfigValue)); + } + if (currentConfigValue instanceof Long) { + parseValue = Integer.toHexString(Float.floatToIntBits((long)currentConfigValue)); + } +// parseValue = Float.t(Float.valueOf(String.valueOf(currentConfigValue))); +// charValue = ((String) parseValue).toCharArray(); +// parseValue = ""; +// for (char assiiChar : charValue) { +// parseValue += "" + (int) assiiChar; +// } + break; + case "int": + parseValue = (int) ((ByteBuf) currentConfigValue).getByte(0) & 0xff; + break; + } + } catch (RuntimeException rx) { + log.error("转换异常,转换类型为{},异常信息为{}", convertType, rx); + } + return parseValue; + } + + public static void main(String[] args) { + float str = 2.8f; + System.out.println(); + //加载自定义函数 +// List customizedFunctions = ClazzUtil.getSubClassList(CustomizedFunction.class, false); +// for (CustomizedFunction customizedFunction : customizedFunctions) { +// AviatorEvaluator.addFunction(customizedFunction); +// } +// Object value = String.valueOf(AviatorEvaluator.execute("hexDateFormat(\"yy-MM-dd-HH-mm-ss\")", null)); +// System.out.println(value); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java new file mode 100644 index 0000000..9b624ce --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/decorator/rule/PrecisionResolver.java @@ -0,0 +1,39 @@ +package com.casic.missiles.replier.decorator.rule; + +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.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author cz + * 精度计算,格式转换? + */ +@Slf4j +public class PrecisionResolver { + + public Object resolveRule(ByteResolverParam byteResolverParam) { + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); + Object value = byteResolverParam.getValue(); + try { + if (ObjectUtil.isEmpty(fieldRuleEngine)) { + return value; + } + String expression = fieldRuleEngine.getExpression(); + Map env2 = new HashMap(); + env2.put("value", value); + String values = String.valueOf(AviatorEvaluator.execute(expression, env2)); + return values; + } catch (ExpressionNotFoundException enf) { + log.error("字节合并出现异常,解析内容为{},aviator表达式为{},异常信息为{}", value, JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java index 822cac6..376cedc 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -15,7 +15,12 @@ @Override public List getCombinedFieldConfigList(Long ruleId) { QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", ruleId); + .and(wq -> { + wq.eq("rule_id", ruleId) + .or() + .eq("rule_id", 0); + + }); List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); return combinedFieldConfigs; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java index 6ae4422..b2b305b 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -18,7 +18,12 @@ @Override public List getFieldConfigList(Long ruleId) { QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", ruleId); + .and(wq -> { + wq.eq("rule_id", ruleId) + .or() + .eq("rule_id", 0); + + }); List fieldConfigList = this.baseMapper.selectList(queryWrapper); return fieldConfigList; }